Req #44043 [Opn->Fbk]: Enforcing a method without specifying the arguments

From: Date: Thu, 06 Aug 2015 21:35:44 +0000
Subject: Req #44043 [Opn->Fbk]: Enforcing a method without specifying the arguments
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-194991@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
 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)

« previous php.bugs (#194991) next »