php - 继承中的私有(private)访问

标签 php class inheritance private-members

class  Person {
    public  $name;
    private $age; //private access
}

class Employee extends Person{
    public $id;
    public $salary; //class property   
}

$emp = new Employee(); 
$emp->name="ABCD";
$emp->age = 30;
$emp->id=101;
$emp->salary=20000;

echo "<br/> Name : ".$emp->name;
echo "<br/> Age : ".$emp->age;

在这段代码中,子类变量$emp可以直接访问父类Person的私有(private)成员。这不是违反私有(private)访问规则吗?

它在使用父类变量时出错,但对子类变量有效!!谁能解释一下为什么?

最佳答案

TLDR;

$emp->age = 30 不调用父私有(private)成员 age,它动态创建新的子对象属性 age

解释

看起来像个错误,不是吗?首先,让我们注释掉父级的私有(private)成员:

<?php

class Person {
    // private $age;
}

class Employee extends Person {
}

$emp = new Employee();
$emp->age = 10;
echo $emp->age . "\n";
//out: 10

$emp->age = 10 行中,我们创建了名为 age$emp 对象的新属性,并为其赋值 10

当您将 parent 的成员定义为私有(private)时, child 根本看不到该成员:

<?php

class  Person {
    private $age;

    function __construct() {
        $this->age = 30;
    }

    public function printAge()
    {
        echo sprintf("Parent::age = %s\n", $this->age);
    }
}

class Employee extends Person {
    private $age;

    function __construct() {
        parent::__construct();
        $this->age = 10;
    }

    public function printAge()
    {
        echo sprintf("Employee::age = %s\n", $this->age);
        parent::printAge();
    }
}

$emp = new Employee();
$emp->printAge();

//out:
//Employee::age = 10
//Parent::age = 30

关于php - 继承中的私有(private)访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47177516/

相关文章:

c# - 覆盖被覆盖的方法 (C#)

php - 使用 SAPRFC 将 PHP 连接到 SAP R/3 - 无法初始化模块

python - 如何在 python 中打印/返回一个类?

c# - C# 中的接口(interface)和类

swift - 在 prepare segue 中为类属性添加值

java - 仅当子类强制转换为父类时才调用子类的方法?

ios - 一个文件还是多个?创建多个 ViewController 类

php - Magento:在边栏中添加登录/我的帐户小部件

javascript - 将 SQL 的表输出样式化到相应的 Bootstrap 列中

php - yii 中的动态查询 where 子句