OOPHP继承查询

时间:2014-08-06 17:22:36

标签: php oop inheritance

据我了解,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");

1 个答案:

答案 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将解析为动态创建的属性,程序将恢复其原始行为。