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

 ID:                 62393
 Comment by:         andre-desch at t-online dot de
 Reported by:        andre-desch at t-online dot de
 Summary:            __callStatic from a derived class object context
                     calls __call instead
 Status:             Not a bug
 Type:               Bug
 Package:            Reflection related
 Operating System:   Windows 7 Prof.
 PHP Version:        5.4.4
 Block user comment: N
 Private report:     N

 New Comment:

It is a static call if You use an empty proxy class like below. The only 
difference in scope is, that MyProxyClass is not directly in the hierachy tree 
above the calling method's class. Please explain why this is intended.

class MyProxyClass extends MyBaseClass { //empty }

class MyDerivedClass extends MyBaseClass {
        function someAction()
        {
                return MyProxyClass::Foo();
        }
}


Previous Comments:
------------------------------------------------------------------------
[2012-06-23 06:39:49] larue...@php.net

if there is a calling scope, then :: is not a static call.

if there is no calling scope, then :: is a static call.

the key point is the calling scope, not the "::" .

thanks

------------------------------------------------------------------------
[2012-06-22 14:46:00] cataphr...@php.net

> The test code is calling MyBaseClass::Foo(), which clearly is a static call.

You are mistaken. MyBaseClass::Foo() is not necessarily a static call. Namely, 
if $this is of type MyBaseClass or a subclass thereof and there's no explicit 
static method MyBaseClass::Foo(), then MyBaseClass::Foo() is an instance call.

------------------------------------------------------------------------
[2012-06-22 11:57:35] john dot papaioannou at gmail dot com

Excuse me, but how exactly does parent::Foo() come into the discussion?

The test code is calling MyBaseClass::Foo(), which clearly is a static call.

------------------------------------------------------------------------
[2012-06-22 11:15:16] johan...@php.net

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

This is due to the way calls to parent::foo() and such are handled, these look 
like static calls but in fact aren't.

------------------------------------------------------------------------
[2012-06-22 10:04:14] andre-desch at t-online dot de

Description:
------------
If You define both the magic function for static and dynamic calls for a class 
and 
then call a static function from a derivate's method, not the static but the 
dynamic magic function is called.

Test script:
---------------
<?php

class MyBaseClass {

        public static function __callStatic($what, $args)
        {
                return 'static call';
        }
        
        public function __call($what, $args)
        {
                return 'dynamic call';
        }

}

class MyDerivedClass extends MyBaseClass {

        function someAction()
        {
                //here I call a base class' static function
                //it returns "dynamic call" instead of "static call"
                return MyBaseClass::Foo();
        }

}

$bar = new MyDerivedClass();
echo $bar->someAction();

?>

Expected result:
----------------
static call

Actual result:
--------------
dynamic call


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



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

Reply via email to