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/