【问题标题】:Why is PHP private variables working on extended class?为什么 PHP 私有变量在扩展类上工作?
【发布时间】:2016-07-28 02:56:01
【问题描述】:

当我尝试从扩展类而不是基类设置属性的值时,它不应该产生错误吗?

<?php
class first{
    public $id = 22;
    private $name;
    protected $email;
    public function __construct(){
        echo "Base function constructor<br />";
    }
    public function printit(){
        echo "Hello World<br />";
    }
    public function __destruct(){
        echo "Base function destructor!<br />";
    }
}
class second extends first{
    public function __construct($myName, $myEmail){
        $this->name = $myName;
        $this->email = $myEmail;
        $this->reveal();
    }
    public function reveal(){
        echo $this->name.'<br />';
        echo $this->email.'<br />';
    }
}
$object = new second('sth','aaa@bbb.com');

?>

【问题讨论】:

  • 不行,它不能访问父类中的私有属性(甚至不知道它存在),所以它在扩展类中创建了一个新的公共属性
  • 只做var_dump$object 我想你会有答案

标签: php constructor private access-specifier


【解决方案1】:

子类中不能访问私有变量。这就是访问修饰符protected 的用途。这里发生的情况是,当您访问一个不存在的变量时,它会使用默认访问修饰符 public 为您创建一个。

这是显示状态的 UML:

请注意:子类仍然可以访问其超类中的所有 publicprotected 方法和变量 - 但不在 UML 图中!

【讨论】:

  • 这就是访问修饰符protected 的用途。 - ...你的意思是private?错别字?
  • @Federico no,protected 子类可以访问该变量。对于private,子类无权访问。 “这就是访问修饰符protected 的用途”。
猜你喜欢
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2012-01-27
  • 2019-09-20
  • 2013-12-17
相关资源
最近更新 更多