0

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

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

MAppAdder 代码段

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

移动应用

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

4

2 回答 2

6

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

声明为 protected 的成员只能在类本身内以及被继承类和父类访问。

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

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

于 2013-01-12T23:06:08.603 回答
0

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

于 2013-01-12T23:05:23.543 回答