Вызов статической функции из экземпляра - PullRequest
5 голосов
/ 19 июля 2011

Я пытаюсь вызвать статическую магическую функцию (__callStatic) от члена ее дочернего класса.Проблема в том, что вместо этого он переходит в нестатический __call.

<?php

ini_set("display_errors", true);

class a
{
    function __call($method, $params)
    {
        echo "instance";
    }

    static function __callStatic($method, $params)
    {
        echo "static";
    }
}

class b extends a
{
    function foo()
    {
        echo static::bar();
        // === echo self::bar();
        // === echo a::bar();
        // === echo b::bar();
    }
}

$b = new b();
echo phpversion()."<br />";
$b->foo();

?>

Вывод:

5.3.6
instance

Как сделать так, чтобы оно отображало «статический»?

Ответы [ 2 ]

6 голосов
/ 26 июля 2011

Если вы удалите магический метод «__call», ваш код вернет «статический».

Согласно http://php.net/manual/en/language.oop5.overloading.php «__callStatic () запускается при вызове недоступных методов в статическом контексте»,

Я думаю, что в вашем коде происходит следующее:

  1. Вы вызываете статический метод из нестатического контекста.
  2. Вызов метода не-статический контекст, поэтому PHP ищет магический метод '__call'.
  3. PHP запускает магический метод '_ call', если он существует.Или, если он не существует, он вызовет ' _callStatic'.

Вот возможное решение:

class a
{
    static function __callStatic($method, $params)
    {
        $methodList =  array('staticMethod1', 'staticMethod2');

        // check if the method name should be called statically
        if (!in_array($method, $methodList)) {
            return false;
        }

        echo "static";

        return true;
    }

    function __call($method, $params)
    {
         $status = self::__callStatic($method, $params);
         if ($status) {
             return;
         }
         echo "instance";
    }

}

class b extends a
{
    function foo()
    {
        echo static::staticMethod1();
    }

    function foo2()
    {
        echo static::bar();
    }
}

$b = new b();
echo phpversion()."<br />";
$b->foo();
$b->foo2();
0 голосов
/ 19 июля 2011

В PHP есть зарезервированные слова self и parent для доступа к статическим методам из класса и / или экземпляра объекта.parent относится к унаследованным методам из родительского класса.

class b extends a
{
    function foo()
    {
        echo parent::bar();
    }
}

РЕДАКТИРОВАТЬ: Хм, это не сработает ... (используя PHP 5.3.5)

$b = new b();
$b->foo();  // displays: instance
a::bar();   // displays: static

2ndРЕДАКТИРОВАТЬ: Ха, это работает только, если вы опустите __call() -метод в классе a.

class a
{
    static function __callStatic($method, $params)
    {
        echo "static";
    }

//  function __call($method, $params)
//    {
//        echo "instance";
//    }
}

class b extends a
{
    function foo()
    {
        echo parent::bar();
    }
}

$b = new b();
$b->foo();  // displays: static
a::bar();   // displays: static
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...