PHP: странное поведение при вызове защищенного метода через статический прокси - PullRequest
2 голосов
/ 07 мая 2011

Я нахожу это действительно странным. Может ли кто-нибудь дать объяснение?

abstract class UIController{
   public static function exec($context,$vdo){
      return call_user_func(array($context, $vdo));   
   }
}

class UIControllerSettings extends UIController{
    protected function save(){
        return "saved\n";
    }
}

$controller = new UIControllerSettings();
echo UIController::exec($controller, 'save'); //<-- prints "saved"
echo $controller->save(); // <-- throws a fatal error 

Не уверен, что это имеет смысл;не должны ли оба вызова привести к фатальной ошибке ??

Заранее спасибо.

Обновление:

Вот вывод:

$ php --version
PHP 5.3.3-1ubuntu9.5 with Suhosin-Patch (cli) (built: May  3 2011 00:48:48) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
$ php test.php 
saved
PHP Fatal error:  Call to protected method UIControllerSettings::save() from context '' in test.php on line 17

Ответы [ 2 ]

4 голосов
/ 07 мая 2011

Class members declared public can be accessed everywhere. Members declared protected can be accessed only within the class itself and by inherited and parent classes:

http://php.net/manual/en/language.oop5.visibility.php.

Поскольку UIController::exec() является правильным способом обращения к публичной статической функции, я предполагаю, что call_use_func () обрабатывается как вызов из самого класса. С другой стороны, $controler->save() не может быть запущен, потому что это защищенная функция.

0 голосов
/ 07 мая 2011

Защищенные методы можно вызывать в любом месте строки наследования объекта (родители и дети).Поскольку UIController::exec, который находится в UIController, который является родителем UIControllerSettings, на самом деле вызывает UIControllerSettings::save, а не основной код, это совершенно нормально.

...