继承中的专用访问

2022-08-30 23:17:17
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;

在此代码中,子类变量可以直接访问父类的私有成员。这难道不是违反私有访问规则吗?$empPerson

使用父类变量时,它给出错误,但与子类变量一起使用!!谁能解释一下为什么?


答案 1

TLDR;

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

解释

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

<?php

class Person {
    // private $age;
}

class Employee extends Person {
}

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

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

当您将父母的成员定义为私有时,孩子根本看不到此成员:

<?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

答案 2

您正在分配 From object()。$emp->age = 30;$emp

现在,当您尝试使用object(不是成员变量)访问任何变量时,它将允许访问并创建本地范围

并不是说它不被视为该特定类的成员变量。

因此,在您的示例中,年龄不被视为任何类的成员,因为它未在其中定义。$emp->age

如果您尝试任何不属于任何类成员的变量名称,您将更清楚地了解。你也会为他们得到结果。

例如,请尝试以下代码:

$emp->age_tmp = 30;

echo "<br/> Age : ".$emp->age_tmp;

因此,问题不在于范围,而在于它将为该变量创建其他副本。 与类没有任何联系$emp->agePersonage

演示


推荐