PHP 中的父 类 是否可以使用受保护的属性?
Are protected attributes available to parent classes in PHP?
我知道子 classes 在 class 中定义受保护的属性时可用,但它们在父 classes 中可用吗?例如:
class My_Class {
// Is $name available here?
}
class My_Subclass extends My_Class {
protected $name = 'Henry';
}
父 class 没有关于其子 class 的信息,所以不,$name
在 My_Class
中不可用。
编辑:正如@deceze 在 My_Class
中的注释代码中正确指出的那样,可以访问 $name
,但这仅在对象是从实现该对象的子 class 中实例化时才有效多变的。访问父级 class 中的变量将给出 Undefined Property
通知。
我也会考虑糟糕的风格和架构,但这是我的意见 ;)
没有。 "protected" 访问修饰符 使任何 属性 和方法从派生可见class。这就是它的用途。但是父 class 永远不知道有关派生 class.
的任何信息
有关详细信息,请参阅 this 文章。
您在 parent class 中编写的代码可以 访问 属性 如果 运行 在上下文中子class。有道理?示例:
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()
不会 工作。正因为如此,使 class 依赖于它未定义的属性是一个非常糟糕的主意。
能见度不仅仅与 $this
顺便说一句,观看:
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!
A parent class 在尝试访问 属性 时有权访问它。这并不意味着所有 parent class 突然自己得到一份 属性。
有时候'can',但你真的不应该这样做
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"}
我知道子 classes 在 class 中定义受保护的属性时可用,但它们在父 classes 中可用吗?例如:
class My_Class {
// Is $name available here?
}
class My_Subclass extends My_Class {
protected $name = 'Henry';
}
父 class 没有关于其子 class 的信息,所以不,$name
在 My_Class
中不可用。
编辑:正如@deceze 在 My_Class
中的注释代码中正确指出的那样,可以访问 $name
,但这仅在对象是从实现该对象的子 class 中实例化时才有效多变的。访问父级 class 中的变量将给出 Undefined Property
通知。
我也会考虑糟糕的风格和架构,但这是我的意见 ;)
没有。 "protected" 访问修饰符 使任何 属性 和方法从派生可见class。这就是它的用途。但是父 class 永远不知道有关派生 class.
的任何信息有关详细信息,请参阅 this 文章。
您在 parent class 中编写的代码可以 访问 属性 如果 运行 在上下文中子class。有道理?示例:
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()
不会 工作。正因为如此,使 class 依赖于它未定义的属性是一个非常糟糕的主意。
能见度不仅仅与 $this
顺便说一句,观看:
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!
A parent class 在尝试访问 属性 时有权访问它。这并不意味着所有 parent class 突然自己得到一份 属性。
有时候'can',但你真的不应该这样做
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"}