据我了解,private
成员只能在拥有它的类中访问,而不能在外部访问,即使是来自该类的子类。
我写了一个小小的测试脚本,试图在我脑海中帮助确保这一切,但它没有输出错误,访问private
成员很好,我不明白为什么!请有人帮帮我吗?
这里是代码:
class Car extends vehicle
{
protected $make;
public function showCar($col, $eng, $mak)
{
$this->colour = $col;
$this->engine = $eng;
$this->make = $mak;
$this->details($this->colour, $this->engine, $this->make);
}
}
class vehicle
{
private $colour;
protected $engine;
public function details($c, $e, $m)
{
echo "{$c} {$e} {$m}";
}
}
$output = new Car;
$results = $output->showCar("red", "v12", "ferarri");
答案 0 :(得分:4)
您的假设不正确。 Car::showCar
不设置vehicle::$colour
的值;它在任何人都可以访问的对象上设置一个名为colour
的(公共)属性。这就是PHP的工作原理:严格要求您声明属性(以及它们的可访问性级别);你可以动态创建和使用它们。
要确定情况确实如此,请更改代码,以便details
不会直接提供相关值,而是将它们从对象中拉出来:
public function showCar($col, $eng, $mak)
{
$this->colour = $col; // creates a new public property named "colour"
$this->engine = $eng; // sets vehicle::$engine
$this->make = $mak; // sets car::$make
$this->details();
}
public function details()
{
echo "{$this->colour} {$this->engine} {$this->make}";
}
在details
的此实现中,对$this->engine
的引用解析为vehicle::$engine
,因为该属性已正式声明。由于showCar
不为该属性赋值,因此输出中不会显示“红色”。如果您随后完全删除了声明private $colour
,那么$this->colour
将解析为动态创建的属性,程序将恢复其原始行为。