Req #50029 [Com]: Weird invoke issue on class as property
| From: | worldoffame at hotmail dot com | Date: | Sat, 02 Nov 2013 23:29:43 +0000 |
| Subject: | Req #50029 [Com]: Weird invoke issue on class as property | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-182563@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=50029&edit=1
ID: 50029
Comment by: worldoffame at hotmail dot com
Reported by: marc dot gray at gmail dot com
Summary: Weird invoke issue on class as property
Status: Analyzed
Type: Feature/Change Request
Package: Class/Object related
Operating System: Ubuntu 9.04
PHP Version: 5.3.0
Block user comment: N
Private report: N
New Comment:
Has this bug been fixed yet? Its one of the most annoying glitches in PHP, and funny it has existed
for more than 4 years.
Previous Comments:
------------------------------------------------------------------------
[2013-08-29 10:50:17] worldoffame at hotmail dot com
Also the argument that invoking class property could override class methods itself is just nonsense.
Guess what? Its a poor design if your method shares the same name as your property anyway. If
collision occurs it looks more like an improper OOP practice to me.
------------------------------------------------------------------------
[2013-08-29 10:44:14] worldoffame at hotmail dot com
Any updates on this? I hope it gets fixed asap, cant believe this bug has been around for 3+ years
and still left untouched. *sigh*
------------------------------------------------------------------------
[2012-06-08 12:24:34] programmierung at pfink dot de
The worst thing on this bug is that is_callable() returns true in this case even though it's
not callable:
The lines
if(is_callable($this->objectWithInvokeMethod))
return $this->objectWithInvokeMethod(0);
produce the fatal error
Fatal error: Call to undefined method MyClass::objectWithInvokeMethod()
------------------------------------------------------------------------
[2011-12-06 16:34:31] karsten at typo3 dot org
I would go for simple rules to solve this. When having a class and calling
$this->prop() PHP should
* use __invoke on $this->prop if there is no method prop() in the class
* if there is an actual method, the method takes precedence
In the latter one can still use $this->prop->__invoke(), but should probably
rather clean up the code. :)
------------------------------------------------------------------------
[2011-08-24 18:49:06] marc dot gray at gmail dot com
I've been thinking about this since the same issue appears to exist with assigning a closure to
a static
variable too (tested in 5.3.5, 5.3.8 & 5.4alpha3.
//----------------------------------
// Create a very basic static class
class closureProperty {
static public $myClosure;
}
// Assign a closure to a class property
closureProperty::$myClosure = function() { echo('Hi'); };
// Fatal error: Function name must be a string
closureProperty::$myClosure();
// Works as expected
$safeCopy = closureProperty::$myClosure;
$safeCopy();
//----------------------------------
I can understand why it happens with dynamic properties, apparently you can have a variable and
function named
identically? I admit I've never tried.
I would propose making identically named variables and functions as deprecated (does anyone
who's any good
actually do that? Talk about poor readability...) and implement a collision warning in the mean
time. I would
also suggest this makes less sense in a static case (due to $ variable prefix) than it did in a
dynamic case,
and should be changed.
If nothing else, some discussion on the matter would be lovely.
Thoughts?
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=50029
--
Edit this bug report at https://bugs.php.net/bug.php?id=50029&edit=1