Edit report at https://bugs.php.net/bug.php?id=49542&edit=1
ID: 49542
Comment by: stan at eproject-inc dot com
Reported by: mjs at beebo dot org
Summary: __callStatic() only invoked if instance method does
not exist
Status: Not a bug
Type: Bug
Package: Class/Object related
Operating System: Ubuntu
PHP Version: 5.3.0
Block user comment: N
Private report: N
New Comment:
Wow. Not a bug? This is a terrible design decision, to say that invoking an
instance method from a non-instance context is intentional. That this is even a
question says volumes.
I've been a user and supporter of the language for several years now, and it's
really sad to see something like this. This is the kind of design philosophy
that gives PHP a bad rap for being difficult to work in.
It's one thing to say "Yes, we have an octopus in our living room. I know, I
know, it's utterly stupid and doesn't make sense, but we're otherwise occupied
right now." It's another thing to say, "Yes, we have an octopus in the living
room. What? No, you're the idiot."
Absurd.
Previous Comments:
------------------------------------------------------------------------
[2012-08-14 18:13:47] loren at kanjoya dot com
Well, if it is not a bug, then it is a very poor and unfortunate language
design
decision.
------------------------------------------------------------------------
[2011-06-09 23:44:40] [email protected]
Not a bug, you need to declare the method 'bar' as static.
------------------------------------------------------------------------
[2010-10-15 03:50:12] matt dot lubner at gmail dot com
I should have also mentioned that calling an instance method in a static
context
does not generate an error, unless the called method has any references to
$this
(which of course is not in scope), in which case a fatal error occurs. This
can
be a little tricky to track down, and so would be preferable if instance
methods
were simply not in scope for static contexts.
------------------------------------------------------------------------
[2010-10-15 03:40:41] matt dot lubner at gmail dot com
With PHP 5.3.2, if the instance method bar() is *not* public, and
__callStatic()
*is*, __callStatic() will be invoked, because bar() won't be in scope.
Unfortunately, this seems like a horribly hacked work-around. Ideally, public
instance methods should not be in scope from a static context, so
__callStatic()
will be called instead.
------------------------------------------------------------------------
[2009-09-13 14:34:38] mjs at beebo dot org
Description:
------------
A static call to Foo::bar() does not invoke __callStatic() if an
instance method bar() exists.
One reason you might want this is to convert static calls to Foo::bar()
to the equivalent operation on a singleton:
public static function __callStatic($name, $args) {
$obj = self::getInstance();
return call_user_func_array(array($obj, $name), $args);
}
In the sample code below, __callStatic() is not invoked even though the
caller has deliberately initiated a static call.
Reproduce code:
---------------
<?php
class Foo {
public static function __callStatic($name, $args) {
echo "In __callStatic()\n";
}
public function bar() {
echo "In bar()\n";
}
}
echo Foo::bar();
Expected result:
----------------
In _callStatic()
Actual result:
--------------
PHP Strict Standards: Non-static method Foo::bar() should not be called
statically in /mnt/hgfs/workspace/scratch/wart1.php on line 15
Strict Standards: Non-static method Foo::bar() should not be called
statically in /mnt/hgfs/workspace/scratch/wart1.php on line 15
In bar()
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=49542&edit=1