在 php 的面向?qū)ο缶幊讨校?dāng)一個成員屬性被定義為 private 或 protected 時枉氮,如果我們試圖在外面直接調(diào)用它或者給屬性賦值都會出現(xiàn)“不能訪問某個私有屬性或受保護(hù)屬性”的錯誤示损。面對這樣的需求朗和,PHP 提供了 __get() 和 __set() 的魔術(shù)方法。其中 __get() 可以訪問非公有屬性谊娇,__set() 可以給非公有屬性賦值肺孤。
1、__get()
方法必須有一個參數(shù)
public function __get($name) // 必有一個參數(shù)
案例
class Person
{
private $name;
private $age;
function __construct($name="", $age=1)
{
$this->name = $name;
$this->age = $age;
}
/**
* 在類中添加__get()方法济欢,在直接獲取非公有屬性時自動調(diào)用一次赠堵,以屬性名作為參數(shù)傳入并處理
* @param $name 訪問的屬性名
*
* @return int
*/
public function __get($name)
{
if ($name == "age") {
if ($this->age > 30) {
return $this->age - 10;
} else {
return $this->$name;
}
} else {
return $this->$name;
}
}
}
$person = new Person("kevin", 60); // 通過Person類實(shí)例化的對象,并通過構(gòu)造方法為屬性賦初值
echo "姓名:" . $person->name . "\r\n"; // kevin, 直接訪問私有屬性name法褥,自動調(diào)用了__get()方法可以間接獲取
echo "年齡:" . $person->age . "\r\n"; // 50, 自動調(diào)用了__get()方法茫叭,根據(jù)對象本身的情況會返回不同的值
echo "\r\n";
2、__set()
方法必須有兩個參數(shù)半等,參數(shù)一:屬性名揍愁,參數(shù)二:屬性值
public function __set($name, $value)
案例
class Person
{
private $name;
private $age;
function __construct($name="", $age=1)
{
$this->name = $name;
$this->age = $age;
}
/**
* 在類中添加 __get()方法,在直接獲取非公有屬性時自動調(diào)用一次杀饵,以屬性名作為參數(shù)傳入并處理
* @param $propertyName
*
* @return int
*/
public function __get($propertyName)
{
if ($propertyName == "age") {
if ($this->age > 30) {
return $this->age - 10;
} else {
return $this->$propertyName;
}
} else {
return $this->$propertyName;
}
}
/**
* 在類中添加 __set()方法莽囤,給對象的非公有屬性賦值
* @param $name 要賦值的屬性
* @param $value
*/
public function __set($name, $value)
{
$this->$name = $value;
}
}
$person = new Person("kevin", 60); // 通過Person類實(shí)例化的對象,并通過構(gòu)造方法為屬性賦初值
$person->name = 'loedan';
$person->age = 20;
echo "姓名:" . $person->name . "\r\n"; // loedan, 通過 __set() 給屬性賦值
echo "年齡:" . $person->age . "\r\n"; // 20, 通過 __set() 給屬性賦值
echo "\r\n";