Hello Timm,

Thursday, February 26, 2004, 12:34:31 AM, you wrote:

> On Wed, 2004-02-25 at 23:52, Timm Friebe wrote:
>> On Wed, 2004-02-25 at 23:44, Marcus Boerger wrote:
>> > Hello Timm,
>> > 
>> > i had the same expirience today too. And also for me it makes not much
>> > sense. The constructor shouldn't check inheritance rules.
>> 
>> Neither should other methods follow this. What if I want to add a
>> non-default parameter to an overriden method?

> Some test cases:

> Should work #1, Bar::connect() adds an argument
No the sugnature is incompatible. An instance of Foo cannot be called
with Bar or Connector's connect() Signature. Hence Bar is not a Foo
or Connector.
> -------------------------------------------------------------------
> <?php
>   interface Connector {
>     function connect($server);
>   }

>   class Foo implements Connector {
>     function connect($server) { }
>   }
  
>   class Bar extends Foo {
>     function connect($server, $port) { }
>   }
?>>

> Should work #2, Bar::connect() might contain something such as
Same asas above
>   parent::connect('foo.example.com');
> -------------------------------------------------------------------
> <?php
>   interface Connector {
>     function connect($server);
>   }

>   class Foo implements Connector {
>     function connect($server) { }
>   }
  
>   class Bar extends Foo {
>     function connect() { }
>   }
?>>

> Should work #3, Bar::connect() might contain something such as
Same as above. Foo::connect() can be called with any value
Bar::connect() not.
>   parent::connect($dsn->getHost());
> -------------------------------------------------------------------
> <?php
>   class DSN { }

>   interface Connector {
>     function connect($server);
>   }

>   class Foo implements Connector {
>     function connect($server) { }
>   }
  
>   class Bar extends Foo {
>     function connect(DSN $dsn) { }
>   }
?>>

> Should work #4, Foo::connect() adds a default argument
Should work, since the calling convention from Connector is still
possible in Foo and Bar. Hence Foo::connect() IS-A Connector::connect()
and Bar::connect() IS-A Connector::connect().
> -------------------------------------------------------------------
> <?php
>   interface Connector {
>     function connect($server);
>   }

>   class Foo implements Connector {
>     function connect($server, $port= 42) { }
>   }
  
>   class Bar extends Foo {
>     function connect($server, $port= 23) { }
>   }
?>>

> Should work #5, both interface and implementer have a default value
> for the argument "server"
Should work. Connector's calling convention is till valid in Bar.
Hence Foo::connect() IS-A Connector::connect() and Bar::connect()
IS-A Connector::connect().
> -------------------------------------------------------------------
> <?php
>   interface Connector {
>     function connect($server= 'localhost');
>   }

>   class Foo implements Connector {
>     function connect($server= 'localhost') { }
>   }
  
>   class Bar extends Foo {
>     function connect($server= 'localhost', $port= 23) { }
>   }
?>>

> Should work #6, implementation adds a default value
Same as #5 only more complicated.
> -------------------------------------------------------------------
> <?php
>   interface Connector {
>     function connect();
>   }

>   class Foo implements Connector {
>     function connect($server= 'localhost') { }
>   }
  
>   class Bar extends Foo {
>     function connect($server= 'localhost', $port= 23) { }
>   }
?>>

> Should NOT work #1, Foo doesn't fully implement connect()
Right shouldn't work.
> -------------------------------------------------------------------
> <?php
>   interface Connector {
>     function connect($server);
>   }

>   class Foo implements Connector {
>     function connect() { }
>   }
  
>   class Bar extends Foo {
>     function connect($server, $port) { }
>   }
?>>

> Should NOT work #2, class / primitive clash on argument
Wrong. Should work. Foo::connect() IS-A Connector::connect() and
Bar::connect() IS-A Connector::connect(). It is no problem that a
derived clsses method accepts a greater value range or set of types.
> -------------------------------------------------------------------
> <?php
>   class DSN { }

>   interface Connector {
>     function connect(DSN $dsn);
>   }

>   class Foo implements Connector {
>     function connect($dsn) { }
>   }
  
>   class Bar extends Foo {
>     function connect($dsn) { }
>   }
?>>

> Should NOT work #3, Foo implements Connector::connect() incorrectly
Should work. Still Foo::connect() IS-A Connector::connect()
and Bar::connect() IS-A Connector::connect().
> -------------------------------------------------------------------
> <?php
>   interface Connector {
>     function connect($server);
>   }

>   class Foo implements Connector {
>     function connect($server, $port) { }
>   }
  
>   class Bar extends Foo {
>     function connect($server, $port= 23) { }
>   }
?>>

> Should NOT work #4, Foo implements Connector::connect() incorrectly
Right, shouldn't work. Inheritance doesn't apply since the signatures
are incompatible.
> -------------------------------------------------------------------
> <?php
>   interface Connector {
>     function connect();
>   }

>   class Foo implements Connector {
>     function connect($server) { }
>   }
  
>   class Bar extends Foo {
>     function connect($server, $port) { }
>   }
?>>

> I would simply refrain from calling
> zend_do_perform_implementation_check() in inheritance.

> - Timm



-- 
Best regards,
 Marcus                            mailto:[EMAIL PROTECTED]

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to