Edit report at https://bugs.php.net/bug.php?id=49542&edit=1

 ID:                 49542
 Comment by:         ni...@php.net
 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:

Guys, do we need to go through this again? Sure, it feels nice to write a rant 
about how all PHP devs are stupid and stuff, but it doesn't help anyone.

Also, don't interpret too much into a simple response. "Not a bug" does not 
mean "you're an idiot". I don't know how you came to that conclusion.

As already pointed out, this behavior is by-design, so yes, it is not a bug - 
at least for some definitions of "bug" (don't forget that any sufficiently 
advanced bug is indistinguishable from a feature).

PHP allows calling non-static methods statically. Doing so is considered bad 
practice nowadays, but this behavior was kept around from PHP 4 times. When 
considering something, please don't forget that things that made sense a few 
years ago don't necessarily make sense now. Heck, from a modern point of view 
static methods shouldn't exist *at all*, because they promote bad design (and 
use of __callStatic in particular so). But, as already said, the feature is 
older than today.

On a tangentially related note, there is a proposal for PHP 5.5 to deprecate 
calls with incompatible context, which has been one of the major WTF moments 
with calling instance methods statically (see 
https://wiki.php.net/rfc/incompat_ctx). This would be the first step in the 
right way.

So, if care about this design issue that much, then the best way to go would be 
to write an RFC with a detailed assessment of the current situation, how the 
issue can be resolved, how much it would impact code, what an appropriate 
migration strategy could be, etc, etc.

Thanks.


Previous Comments:
------------------------------------------------------------------------
[2012-08-14 20:37:10] stan at eproject-inc dot com

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.

------------------------------------------------------------------------
[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] fel...@php.net

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.

------------------------------------------------------------------------


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=49542


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=49542&edit=1

Reply via email to