PHP中可以通过子类的实例访问和重新分配父类中的私有属性,但受保护的不能

问题描述

我很困惑为什么 $produk1->harga = 500; 仍然可以进行更改 (或重新分配值 500)private $harga 属性,尽管 private $harga 中的 class Produk 具有 PRIVATE 可见性$product1class Komik一个实例。

$produk1 = new Komik("Naruto","Masashi Kishimoto","Shonen Jump",30000,100);

然后通过 echo $produk1->harga; 它打印出 500 而不是 ERROR。但是当我将可见性更改为 protected $harga 时,它会打印出错误。怎么来的?我不明白。谢谢你的回答。

    <?PHP
        
        class Produk {
            public $judul = "judul",$penulis = "penulis",$penerbit = "penerbit";
            private $harga;
        
        
            public function __construct($judul,$penulis,$penerbit,$harga) {
                $this->judul = $judul;
                $this->penulis = $penulis;
                $this->penerbit = $penerbit;
                $this->harga = $harga;
            }
        
            public function detailInfo() {
                $str = "{$this->judul} | {$this->penulis},{$this->penerbit} (Rp.{$this->harga})";
        
                return $str;
            }
        
        }
        
        class Komik extends Produk {
            public $jumlahHalaman = 0;
        
            public function __construct($judul,$harga,$jumlahHalaman) {
        
                parent::__construct($judul,$harga);
                $this->jumlahHalaman = $jumlahHalaman;
            }
        
            public function detailInfo() {
                $str = "Komik : " . parent::detailInfo() . " - {$this->jumlahHalaman} halaman.";
        
                return $str;
            }
        }
        
        
        class Game extends Produk {
        
            public $jumlahDurasi = 0;
        
            public function __construct($judul,$jumlahDurasi) {
                
                parent::__construct($judul,$harga);
                $this->jumlahDurasi = $jumlahDurasi;
            }
        
            public function detailInfo() {
                $str = "Game : " . parent::detailInfo() . " ~ {$this->jumlahDurasi} jam.";
        
                return $str;
            }
        }
        
        
        $produk1 = new Komik("Naruto",100);
        $produk2 = new Game("Uncharted","Neil Druckmann","Sony Computer",250000,5);
        
        
        echo $produk1->detailInfo();
        echo "<br>";
        echo $produk2->detailInfo();
        
        echo "<hr>";
        $produk1->harga = 500;
        echo $produk1->harga;

输出 =

Komik : 火影忍者 | Masashi Kishimoto,Shonen Jump (Rp.30000) - 100 halaman。 游戏:神秘海域| Neil Druckmann,索尼计算机 (Rp.250000) ~ 5 jam。


500

IF $harga 属性可见性受到保护

    <?PHP
        
        class Produk {
            public $judul = "judul",$penerbit = "penerbit";
            protected $harga;
.
.
.

输出 =

致命错误:未捕获的错误:无法访问受保护的财产 Komik::$harga in ...

错误:无法访问受保护的财产 Komik::$harga in ...

解决方法

这是因为私有属性不是继承的,当您尝试从子类访问私有属性时 - PHP 找不到它并动态创建新的公共属性。请参见下面的示例。 受保护的属性是继承的,这就是您无法从代码的其他部分访问它们的原因。

<?php

class A {
    private $property = 100;
    
    public function print() {
        echo $this->property;
    }
}

class B extends A {}

$b = new B();
$b->property = 500;
$b->print(); // 100

var_dump($b);
/* object(B)#1 (2) {
  ["property":"A":private]=>
  int(100)
  ["property"]=>
  int(500)
} */
,

受保护的变量可以在子类中访问。但是,您不是在子类内部访问它,而是在子类之外访问它。

您可以通过像

这样的 getter() 函数来访问受保护的成员
public function getHarga()
{
    return $this->$harga;
}

您可以看到 doc 以了解可见性。