Req #44043 [Com]: Enforcing a method without specifying the arguments

From: Date: Fri, 07 Aug 2015 10:22:02 +0000
Subject: Req #44043 [Com]: Enforcing a method without specifying the arguments
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-194998@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=44043&edit=1 ID: 44043 Comment by: seld@php.net Reported by: j dot boggiano at seld dot be Summary: Enforcing a method without specifying the arguments Status: Feedback Type: Feature/Change Request Package: *General Issues Operating System: * PHP Version: 6CVS-2008-02-04 (snap) Assigned To: cmb Block user comment: N Private report: N New Comment: Well yes, let's just close this, it's quite clear it is not gonna happen at this point, and variadics kind of serve that purpose. I can't close it though but feel free whoever has access. Previous Comments: ------------------------------------------------------------------------ [2015-08-06 21:35:40] cmb@php.net Well, there'll be no PHP 6, and PHP 7 behaves basically identical to PHP 5, see <http://3v4l.org/eamAR>. Anyhow, I have doubts that this would be a desirable feature, because an instance of a subclass is supposed to be able to be used instead of an instance of its superclass (LSP). Consider: <?php function do_something(Parnt $parent) { $parent->foo(); } do_something(new Child); ?> Furthermore, as of PHP 5.6.0 there is the possibility to declare variadic functions, what's basically what Marcus suggested. Can this feature request be closed? ------------------------------------------------------------------------ [2008-02-04 20:58:07] j dot boggiano at seld dot be 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". ------------------------------------------------------------------------ [2008-02-04 20:27:32] helly@php.net 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. ------------------------------------------------------------------------ [2008-02-04 18:44:46] 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. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=44043&edit=1

« previous php.bugs (#194998) next »