Intereting Posts
Автоматическое выключение мини-корзины через 2 секунды в WooCommerce загрузить jquery модальный диалог после задержки MySQL наибольшее значение в строке? Определение кросс-платформенной функции money_format (Linux и Windows) Как получить число последователей страниц в Instagram? Как получить данные с одной php-страницы с помощью ajax и передать ее на другую php-страницу, используя ajax mysql_data_seek pdo эквивалент php fputcsv и охватывающие поля Выяснение установленной версии ветки запрашивать базу данных mysql внутри класса как разобрать файл csv, чтобы сначала захватить имена столбцов, а затем строки, относящиеся к нему? Загрузка, извлечение и повышение производительности PHP Как предотвратить множественный вход пользователя с тем же именем пользователя и паролем? Как трюк XOR для замены двух переменных действительно работает на строке? Почему активный шаблон записи не работает с богатыми доменами?

Вызов статической функции из экземпляра

Я пытаюсь вызвать статическую магическую функцию ( __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 

Как я могу заставить его отображать «статические»?

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

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

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

    1. Вы вызываете статический метод из нестатического контекста.
    2. Вызов метода находится в нестационарном контексте, поэтому PHP ищет магический метод __call.
    3. PHP запускает магический метод « вызов», если он существует. Или, если он не существует, он будет называть « _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(); 

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

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

    EDIT: Uhm, это не делает трюк … (используя PHP 5.3.5)

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

    2nd EDIT: Ha, он работает только, если вы опускаете метод __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