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

时间:2013-01-12 23:01:07

标签: php inheritance

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

我认为protected表示子类可以使用资源而不是父类。 PHP是否与其他语言不同,或者我对继承如何工作不正确的理解?

MAppAdder Snippet

class MAppAMAdder extends MApp
{
    protected $database_object; // private will cause a fail.

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;
    }
}

错误

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

2 个答案:

答案 0 :(得分:6)

在PHP中protected表示父类也可以访问该属性:

  

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

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

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

答案 1 :(得分:0)

超类如何使用仅在子类中定义的字段?这不能正常工作。您可以从子类中访问超类的任何字段,只要它被声明为publicprotected即可。子类无法访问private个字段。然而,超类对可能存在的任何子类一无所知。