1. 程式人生 > >php面向物件魔術方法筆記

php面向物件魔術方法筆記

<?php

//魔術方法

//__get方法:當程式設計師去使用不可訪問的屬性時;系統就會呼叫__get方法 //不可訪問的屬性是指:該屬性不存在;直接訪問了protected或者private屬性 //__set方法:當程式設計師去給不可訪問的屬性賦值時系統會去呼叫__set方法 //示例: header('content-type:text/html;charset=utf8'); echo '

';
class Monkey{
	public $name;
	protected $food;
	public function __construct($name,$food){
		$this->food = $food;
		$this->name = $name;
	}
//	魔術方法__get
//	__get和後面的pro_name形參為固定的不可更改
//	通過__get取出protected或者private裡面的
	public function __get($pro_name){
		echo '
pro_name:'.$pro_name; // 寫法如下 // 通過property_exists()方法用於檢測有無此屬性 if(property_exists($this,$pro_name)){ return $this->$pro_name; }else{ return '沒有這個屬性無法返回!'; } } // __set魔術方法改變受保護屬性值 public function __set($pro_name,$pro_val){ echo '
'.$pro_name; echo '
'.$pro_val; // 通過property_exists()方法用於檢測有無此屬性 if(property_exists($this,$pro_name)){ $this->$pro_name = $pro_val; }else{ return '沒有這個屬性無法修改!'; } } } //建立一個monkey1 $monkey1 = new Monkey('孫悟空','蟠桃','30'); echo '
猴子的名字是:'.$monkey1->name; //如果想直接取出protected和private裡面的 echo '
猴子的食物是:'.$monkey1->food; //__set魔術方法 //修改猴子的食物和名字 $monkey1->name = '野猴子'; $monkey1->food = '蘋果'; var_dump($monkey1); //__isset和__unset魔術方法 //當對不可訪問的屬性進行了isset($物件名->屬性名)或者empty($物件名->屬性)操作;那麼__isset函式就會被呼叫 //當對不可訪問的屬性進行了unset($物件名->屬性名)那麼__unset函式就會被呼叫 //unset是直接銷燬的變數 //案例: echo '
'; class Cat{ public $name; private $food; public function __construct($name,$food){ $this->food = $food; $this->name = $name; } // 執行__set魔術方法將避免下面的age成員屬性的過載;如果不新增這個魔術方法age屬性將會被動態的新增給$cat物件 public function __set($pro_name,$pro_val){ } } $cat1 = new Cat('張三','雞肉'); var_dump($cat1); $cat1 ->age = '20'; var_dump($cat1);
頁面輸出: