PHP:通过静态代理调用受保护方法时的奇怪行为

时间:2011-05-06 22:48:37

标签: php oop php-5.3

我发现这很奇怪......有人可以解释一下吗?

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 个答案:

答案 0 :(得分:4)

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()无法运行,因为它是受保护的函数。

答案 1 :(得分:0)

可以在对象的继承行(父对象和子对象)中的任何位置调用受保护的方法。因为UIController::exec中的UIControllerUIControllerSettings的父级,实际上正在调用UIControllerSettings::save而不是主代码,所以它完全可以。