继承中的私有访问

Man*_*kar 15 php inheritance class 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;
Run Code Online (Sandbox Code Playgroud)

在此代码中,子类变量$emp可以Person直接访问父类的私有成员.这不违反私人访问规则吗?

使用父类变量时会出错,但是使用子类变量!! 有谁能解释为什么?

Iva*_*ita 19

TLDR;

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

说明

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

<?php

class Person {
    // private $age;
}

class Employee extends Person {
}

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

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

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

<?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
Run Code Online (Sandbox Code Playgroud)