为什么继承似乎以一种意想不到的方式起作用?

0 php inheritance

MApp用途$database_object.我收到一个错误,我无法使用它,因为它是私有的.但是我把它改成了受保护的,现在它起作用了.请注意,在类层次结构中,MApp位于MAppAMAdder之上.

我认为受保护意味着子类可以使用资源而不是父类.PHP与其他语言有什么不同,还是我对继承如何工作不正确的理解?

MAppAdder片段

class MAppAMAdder extends MApp
{
    protected $database_object; // private will cause a fail.
Run Code Online (Sandbox Code Playgroud)

MAPP

abstract class MApp extends M
{
    protected function getID($pipe)
    {
        $temp = $this->database_object->_pdoQuery('single', 'pull_id_by_h_token',
            array($pipe['server']['smalls']['h_token']));
        $pipe['id'] = $temp['id'];
        return $pipe;
    }
    protected function addTweetTop($pipe, $comment)
    {
        $input = array( $pipe['server']['smalls']['h_token'], 
                        $pipe['server']['smalls']['picture'], 
                        $pipe['server']['smalls']['name'], 
                        $comment, 
                        time(), 
                        $pipe['server']['smalls']['h_file'] );
        $this->database_object->_pdoQuery( 'none', 'tweet_insert', $input);
        return $pipe;
    }
}
Run Code Online (Sandbox Code Playgroud)

错误

致命错误:无法访问私有财产MAppTweet :: $ database_object in ...

Jon*_*Jon 6

在PHP中protected意味着父类也可以访问该属性:

声明受保护的成员只能在类本身以及继承和父类中访问.

你是对的,因为这种行为不同于强类型语言(如C++和Java)的"经典"行为.在这些语言(通常称为静态类型)中,编译器会阻止您以通过发出编译时错误而无法证明正确的方式访问类成员.这就是为什么父类不能推测性地访问子类中定义的成员的原因:不能保证成员将在运行时存在.

另一方面,PHP是动态类型的,并且允许您引用任何成员,甚至是根本不存在的成员(null在这种情况下访问结果).检查是否存在这样的成员是在运行时执行的,并且可能导致各种结果(在某些情况下从无异常到运行时错误).