ID:               45159
 Updated by:       [EMAIL PROTECTED]
 Reported By:      reto at buxaprojects dot com
-Status:           Verified
+Status:           Wont fix
 Bug Type:         Class/Object related
 Operating System: Fedora
 PHP Version:      6CVS-2008-06-03 (snap)
 New Comment:

Actually, in this particular case, it's completely expected.

Class A {
  public function foo() {

  }
}

class B extends A {
  public function bar() {
    parent::foo(); // normal call
    static::foo(); // normal call as well
    A::foo(); // same here...
  }
}

$b = new B; $b->bar();

Now, for BC purposes, it would probably break things if those call
suddenly stop calling __call in case A::foo() wasn't defined, which how
it currently works in PHP 5.


Previous Comments:
------------------------------------------------------------------------

[2008-06-03 13:10:08] [EMAIL PROTECTED]

This is somewhat expected, a call to foo::bar() from a non-static
context will be a non-static call, unless the function is explicitly
defined as static. 

However, some of this(especially the part about calling a "static
method" from/to an invalid context) is scheduled for cleanup.

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

[2008-06-03 11:59:19] reto at buxaprojects dot com

Description:
------------
__call() instead of __callStatic() is called, when we call a static
method from a non-static method.

Reproduce code:
---------------
abstract class One
{
        public function __call($m, $p)
        {
                echo '__call(' . $m . ') called' . "\n";
        }
        public static function __callStatic($m, $p)
        {
                echo '__callStatic(' . $m . ') called' . "\n";
        }
}
class Two extends One
{
        public function __construct()
        {
                $this->normalMethod();
                self::staticMethod();
        }
        
        private function normalMethod()
        {
                echo 'normalMethod() called' . "\n";
                parent::a();
                self::b();
                static::c();
                One::d();
                Two::e();
        }
        
        private static function staticMethod()
        {
                echo 'staticMethod() called' . "\n";
                parent::a();
                self::b();
                static::c();
                One::d();
                Two::e();
        }
}
$two = new Two();

Expected result:
----------------
normalMethod() called
__call(a) called
__callStatic(b) called
__callStatic(c) called
__callStatic(d) called
__callStatic(e) called
staticMethod() called
__callStatic(a) called
__callStatic(b) called
__callStatic(c) called
__callStatic(d) called
__callStatic(e) called


Actual result:
--------------
normalMethod() called
__call(a) called
__call(b) called
__call(c) called
__call(d) called
__call(e) called
staticMethod() called
__callStatic(a) called
__callStatic(b) called
__callStatic(c) called
__callStatic(d) called
__callStatic(e) called



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


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

Reply via email to