Req #49542 [Com]: __callStatic() only invoked if instance method does not exist

2010-10-14 Thread matt dot lubner at gmail dot com
Edit report at http://bugs.php.net/bug.php?id=49542&edit=1

 ID: 49542
 Comment by: matt dot lubner at gmail dot com
 Reported by:mjs at beebo dot org
 Summary:__callStatic() only invoked if instance method does
 not exist
 Status: Open
 Type:   Feature/Change Request
 Package:Feature/Change Request
 Operating System:   Ubuntu
 PHP Version:5.3.0
 Block user comment: N

 New Comment:

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.


Previous Comments:

[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:
---
http://bugs.php.net/bug.php?id=49542&edit=1


Req #49542 [Com]: __callStatic() only invoked if instance method does not exist

2010-10-14 Thread matt dot lubner at gmail dot com
Edit report at http://bugs.php.net/bug.php?id=49542&edit=1

 ID: 49542
 Comment by: matt dot lubner at gmail dot com
 Reported by:mjs at beebo dot org
 Summary:__callStatic() only invoked if instance method does
 not exist
 Status: Open
 Type:   Feature/Change Request
 Package:Feature/Change Request
 Operating System:   Ubuntu
 PHP Version:5.3.0
 Block user comment: N

 New Comment:

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.


Previous Comments:

[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:
---
http://bugs.php.net/bug.php?id=49542&edit=1