问题描述
我很困惑为什么 $produk1->harga = 500;
仍然可以进行更改
(或重新分配值 500) 到 private $harga
属性,尽管 private $harga
中的 class Produk
具有 PRIVATE 可见性? $product1
是 class 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 以了解可见性。