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 的信息,所以不,$nameMy_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"}