我知道子类在类中定义时可以使用受保护的属性,但它们是否在父类中可用?例如:
class My_Class {
// Is $name available here?
}
class My_Subclass extends My_Class {
protected $name = 'Henry';
}
答案 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文章。