我发现这很奇怪......有人可以解释一下吗?
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
答案 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
中的UIController
是UIControllerSettings
的父级,实际上正在调用UIControllerSettings::save
而不是主代码,所以它完全可以。