Я пытаюсь вызвать статическую магическую функцию ( __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 () запускается при вызове недоступных методов в статическом контексте».
Я думаю, что в вашем коде происходит то, что,
Вот возможное решение:
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