Req #44043 [Opn->Fbk]: Enforcing a method without specifying the arguments
Edit report at https://bugs.php.net/bug.php?id=44043&edit=1
ID: 44043
Updated by: cmb@php.net
Reported by: j dot boggiano at seld dot be
Summary: Enforcing a method without specifying the arguments
-Status: Open
+Status: Feedback
Type: Feature/Change Request
-Package: Feature/Change Request
+Package: *General Issues
Operating System: *
PHP Version: 6CVS-2008-02-04 (snap)
-Assigned To:
+Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
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?
Previous Comments:
------------------------------------------------------------------------
[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
Thread (6 messages)