PHP中的父类是否可以使用受保护的属性?

时间:2015-02-05 11:58:21

标签: php oop

我知道子类在类中定义时可以使用受保护的属性,但它们是否在父类中可用?例如:

class My_Class {
    // Is $name available here?
}

class My_Subclass extends My_Class {
    protected $name = 'Henry';
}

4 个答案:

答案 0 :(得分:3)

如果在子类的上下文中运行,则在父类中编写的代码可以访问该属性。有道理?例如:

class My_Class {
    public function test() {
        echo $this->name;
    }
}

class My_Subclass extends My_Class {
    protected $name = 'Henry';
}

$a = new My_Class;
$b = new My_Subclass;

$a->test(); // doesn't work
$b->test(); // works

显然(希望)My_Class的实例不会突然发布name属性,因此$a->test() 赢得工作。正因为如此,使一个类依赖于它没有定义的属性是一个非常糟糕的主意。

可见性不仅与$this BTW有关,请注意:

class My_Class {
    public function test($obj) {
        echo $obj->name;
    }
}

class My_Subclass extends My_Class {
    protected $name = 'Henry';
}

$a = new My_Class;
$a->test(new My_Subclass);  // Amazeballs, it works!

如果父类尝试访问该属性,则该类可以访问该属性。这并不意味着所有父类本身都会突然获得该属性的副本。

答案 1 :(得分:2)

父类没有关于其子类的信息,所以不,$name中没有My_Class

编辑:正如@deceze在My_Class中的注释代码中正确指出的那样可以访问$name,但只有在从实现该变量的子类实例化对象时,这才有效。访问父类中的变量将发出Undefined Property通知。

此外,我会考虑糟糕的风格和建筑,但这是我的意见;)

答案 2 :(得分:1)

有时它'可以',但你真的不应该这样做

class A { 
    function set() {
        $this->v = 'a';
    } 
    function get() {
        return $this->v;
    }
} 
class B extends A{ 
    protected $v = 'b';
}
echo $b->get();//b
$b->set();
echo $b->get();//a
var_dump($b); //class B#1 (1) { protected $v => string(1) "a"}

$a = new A();
echo $a->get(); //Undefined property: A::$v
$a->set();
$a->get();//a
var_dump($a); //class A#2 (1) { public $v => string(1) "a"}

答案 3 :(得分:-2)

没有。 "的 保护 " 访问修饰符使任何属性和方法都可以从派生类中看到。这就是它的用途。但是父类从不知道有关派生类的任何信息。

有关详细信息,请参阅this文章。