欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

php 中 __get

王素珍1年前5瀏覽0評論

在php中,__get()是一個非常有用的魔術(shù)方法,有些php開發(fā)者對這個方法可能不太熟悉,但它在面向?qū)ο缶幊讨械氖褂梅浅V泛。在本篇文章中,我們將深入探討__get()方法,幫助讀者更好地了解這個魔術(shù)方法的特點(diǎn),并發(fā)現(xiàn)它的潛在用途。

屬性訪問是面向?qū)ο缶幊讨械囊粋€非常基礎(chǔ)的概念,當(dāng)我們在類中訪問某個類的屬性時,可以使用$this來實(shí)現(xiàn)。但是當(dāng)我們嘗試訪問一個不存在的屬性時,php引擎默認(rèn)會拋出一個Notice級別的錯誤,并且代碼也不會繼續(xù)執(zhí)行下去。

class Foo{
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
$person = new Foo('Lucy', 22);
echo $person->name;
echo $person->email;

上面的代碼中,我們創(chuàng)建了一個Foo類,并且實(shí)例化了一個對象$person。在第4、5行中,我們定義了name和age兩個屬性,通過構(gòu)造函數(shù)進(jìn)行初始化。在第8行我們訪問了$name屬性,代碼可以正常運(yùn)行,并輸出Lucy。但在第9行,我們嘗試訪問$Person對象的$email屬性,因?yàn)檫@個屬性不存在,代碼會拋出Notice錯誤:

Notice: Undefined property: Foo::$email in /var/www/html/index.php on line 13

但是很多時候,我們會需要在程序運(yùn)行時獲取一個對象的屬性并進(jìn)行一些邏輯處理,從而得到我們想要的結(jié)果。這時候,我們可以使用__get()方法來捕獲類中不存在的屬性,并做出相應(yīng)的處理。

class Foo{
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
public function __get($property) {
if ('email' === $property) {
return 'example@example.com';
}
}
}
$person = new Foo('Lucy', 22);
echo $person->name;
echo $person->email;

在我們的代碼中,我們對Foo類新增了一個__get()方法,當(dāng)我們訪問類中不存在的屬性時,__get()方法會被觸發(fā),$property變量將會是我們所訪問的屬性名。在該方法中,我們可以根據(jù)$property的值返回一個相應(yīng)的結(jié)果。在上述示例中,當(dāng)訪問$person->email時,__get()方法會將'email'作為參數(shù),判斷是否等于$email屬性,然后返回‘example@example.com’。因此,在該示例中,我們可以正常輸出$email的值。

同時,__get()方法也可以讓我們動態(tài)地獲取類的屬性,比如從數(shù)據(jù)庫或外部接口中獲取,以實(shí)現(xiàn)更為靈活的編程邏輯。

__get()方法處理了我們類中不存在的屬性訪問,但是如果類中同時定義了一個存在的屬性和__get()方法,那么優(yōu)先級會如何呢?這時候,__get()方法將會被忽略,php引擎會直接使用類中已定義的屬性。

class Foo{
public $name;
public $age;
private $email;
public function __construct($name, $age, $email) {
$this->name = $name;
$this->age = $age;
$this->email = $email;
}
public function __get($property) {
if ('email' === $property) {
return 'example@example.com';
}
}
}
$person = new Foo('Lucy', 22, 'lucy@example.com');
echo $person->name;
echo $person->email;

在上述示例中,我們對Foo類新增了一個私有的$email屬性,同時定義了一個__get()方法。在Foo類的構(gòu)造函數(shù)中,$email屬性被初始化為‘lucy@example.com'。在這種情況下,__get()方法將不再使用,php引擎依舊會返回$email屬性的實(shí)際值。

總結(jié)一下,__get()方法作為php的一種魔術(shù)方法,為類的屬性訪問提供了一種強(qiáng)大的后備和匹配機(jī)制。它的核心思想是“延遲綁定”,在屬性訪問的時候才去決定使用那個屬性,而動態(tài)處理屬性內(nèi)容也可以從此實(shí)現(xiàn)。同時,它還可以防止程序的一些Notice錯誤。