Hi !

You misunderstand what LSP means. It does not mean "overriding methods should have same signatures", it means "overriding methods should accept any data that base method accepts". It never says it can not accept any other data.
Idem.
So you can have :

class A { public function f($a) { ... } }
class A1 extends A { public function f($a = null) { ... } }
class A2 extends A { public function f($a, $b = null) { ... } }

BUT You can't have :

class A3 extends A { public function f() { ... } }

I'm agree that it's valid from PHP point of view because the language does not handle the argument in $a3->f(uniqid()), but it's totaly invalid from OOP point of view.

So if it's invalid for "normal" method, it's more invalid for abstract method, even if abstract method is constructor.
Abstract method define a MANDATORY interface.
So you can have :

abstract class A { public abstract function f($a); }
class A1 extends A { public function f($a = null) { ... } }
class A2 extends A { public function f($a, $b = null) { ... } }

BUT You can't have :

class A3 extends A { public function f() { ... } }

And the use of func_get_args() is not incompatible with that :

class A4 extends A {
  public function ($a) {
    $variadicArgs = array_slice(func_get_args(), 1);
  }
}

Best regard,
Fred

--
========================================================================
Frédéric Hardy : Architecte d'application/Admin. système/Ergonome
           CV : http://blog.mageekbox.net/public/cv.frederic.hardy.pdf
         Blog : http://blog.mageekbox.net
      Twitter : http://twitter.com/mageekguy
========================================================================


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

Reply via email to