|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2008-02-04 18:44 UTC] j dot boggiano at seld dot be
Description:
------------
The purpose of this is to allow an abstract class or an interface to enforce the implementation of a method, without however enforcing the arguments signature.
This is -as I understand it- not a bug, but a feature request.
Reproduce code:
---------------
/***
* This works in PHP5 but does not anymore in PHP6
*/
class Parnt {
public function foo() {}
}
class Child extends Parnt {
public function foo($arg){}
}
/***
* Those don't work in either 5 or 6
*/
abstract class Abst {
abstract public function foo();
}
class Child2 extends Abst {
public function foo($arg){}
}
interface Int {
public function foo();
}
class Child3 implements Int {
public function foo($arg){}
}
Expected result:
----------------
/***
* Proposal for a solution
*/
abstract class AbstFixed {
abstract public function foo;
}
class Child4 extends AbstFixed {
public function foo($arg){}
}
// => Declaring the method without parenthesis (which currently throws a parse error) would allow the implementations of this method to use any argument signature they please.
Actual result:
--------------
At the moment those three examples throw a fatal error in PHP6 with : Declaration of Child::foo() must be compatible with that of Parnt::foo()
I don't think it is a bug, but I think having the capability to allow variable function signatures would definitely be a plus, especially with PHP6 coming that prevents the first example to work.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Oct 26 08:00:02 2025 UTC |
What we could do is adding '...'. That way you can do stuff like: interface Foo { function bar($first, ...); } Now all classes that derive from Foo must implement the same function protocol, for instance: class Baz { function bar($first, ...) {} } Anything else would violate the inheritance rules.As I understand it, the following example would work, right ? interface Foo { function bar(...); } class Baz implements Foo { function bar($first, $second, $third, $whatever) {} } If so, it's exactly what I'm looking for, your syntax is as good as mine as far as I'm concerned. In fact it's even better as it allows for a partial signature enforcement while still leaving the argument list "opened".