php对象魔术方法,php学习之类与对象的魔术方法的使用
原標題:php學習之類與對象的魔術方法的使用
魔術方法有哪些
__construct:構造方法
__destuct:析構方法
__call:在對象中調用一個不可訪問的方法時。__call()會被調用
__callStatic:
__get:調用不可訪問的屬性
__set:給不可訪問的屬性賦值或修改值
__isset:
__unset:
__sleep:串行化的時候用,涉及到序列化
__wakeup:反串行化的時候用,涉及到序列化
__toString:
__set_state:
__clone:對象克隆前被調用
說明:
魔術方法都是系統提供的
所有的魔術方法,前面都是以__兩個下劃線
我們在自定義函數時,不建議已經能用兩個_開始
魔術方法是在滿足某個條件時,系統自動調用
訪問控制修飾符的基本知識
訪問修飾符包括:
public:公有,被定義該修飾的成員可以在任何地方被訪問
protected:受保護的,被定義該修飾符的成員可以被自身及其子類和父類訪問
private:私有。被定義該修飾符的成員只能被其定義所在的類中訪問
訪問修飾符既可以修飾成員屬性,也可以修飾成員方法
訪問protected,private不可以直接訪問,解決方法是編寫一個public的成員方法,來操作protected和private屬性
<?phpclass Person{public $name;protected $age;private $sex;//構造方法public function __construct ($name,$age,$sex){$this->name = $name;$this->age = $age;$this->sex = $sex;} //訪問protected屬性public function get_age(){return $this->age;} //訪問private屬性public function get_sex(){return $this->sex;}}//創建對象$p1 = new Person('張三',23,'男');//訪問各個屬性//訪問公共屬性public ,則可以直接訪問echo $p1->name;//訪問protected,不可以直接訪問,解決方法是編寫一個public的成員方法,來操作protected屬性echo $p1->get_age();//訪問private,不可以直接訪問,解決方法是編寫一個public的成員方法,來操作private屬性echo $p1->get_sex();
魔術方法之 __get函數和__set函數
當開發者去使用不可以訪問的屬性時,系統就會調用__get方法
不可訪問的屬性指:
屬性不存在
直接訪問protected屬性
直接訪問private屬性
當去給不可訪問的屬性直接賦值時,系統會調用__set方法
案例:
成員屬性不可訪問或者被私有,希望用對象名->變量名來賦值和取值
<?php class Monkey{public $name;protected $food;//構造方法,public function __construct($name,$food){$this->name = $name;$this->food = $food;}//魔術方法—__get()//$monkey_name代表形參,傳過來的被私有或者受保護的屬性名這里指的是$foodpublic function __get($monkey_name){//做一個判斷if(property_exists($this,$monkey_name)){return $this->$monkey_name;}else{return '沒有該屬性值';}}//魔術方法- __set()public function __set($monkey_name,$monkey_val){if(property_exists($this,$monkey_name)){$this->$monkey_name = $monkey_val;}else{return '該屬性不存在';}}}//創建對象$monkey1 =new Monkey('小白','胡蘿卜');echo $monkey1->name;echo $monkey1->food;//修改屬性值$monkey1->name = '程序猿';//公共屬性直接可以修改賦值echo $monkey1->name;//默認protected的屬性賦值時,會調用set方法$monkey1->food = '夜宵';$monkey1->food;
魔術方法之 __isset和__unset方法
當對不可訪問的屬性進行isset($對象名->屬性),empty($對象名->屬性)操作時,系統就會調用__isset函數
當對不可訪問的屬性進行unset($對象名->屬性),系統就會調用__unset()函數
案例:unset($house->name);//Fatal error: Cannot access private property House::$name in D:\wamp64\www\issetunset.php on line 40
直接訪問會提示不能調用被私有的屬性,此時會自動調用__unset()魔術方法,在魔術方法中執行刪除,然在打印,就會被刪除掉
<?php //定義一個房子類Houseclass House {//定義三個成員屬性,價格Price、地址add、姓名name其中姓名私有privatepublic $price;public $add;private $name;//定義構造方法public function __construct ($price,$add,$name){$this->price = $price;$this->add = $add;$this->name =$name;//魔術方法}public function __isset($name1){//property_exists()判斷對象的屬性或方法是否存在if(property_exists($this,$name1)){echo '存在';}else{echo 2;}}//魔術方法—__unset()public function __unset($name){//判斷成員屬性是否存在if(property_exists($this,$name)){unset($this->$name);}else{echo '不存在';}}}$house = new House(1000,'陜西西安','張三');//直接調用name返回的是2,被私有了無法賦值,用isset判斷時要想用$對象名->屬性名訪問,就要使用魔術方法__isset(); if(isset($house->name)){echo $house->name;}else{echo 2;}//add屬性是公開的,所以可以直接打印出來值if(isset($house->add)){echo $house->add;}else{echo 2;}//unset()銷毀成員屬性unset($house->name);//Fatal error: Cannot access private property House::$name in D:\wamp64\www\issetunset.php on line 40直接訪問會提示不能調用被私有的屬性,此時會自動調用__unset()魔術方法,在魔術方法中執行刪除,然在打印,就會被刪除掉var_dump($house);?>
魔術方法之__toString
當我們希望將一個對象當作字符串輸出時,就會觸發__toString魔術方法
魔術方法tostringtostring沒有形式參數debug調試時,需要查看對象信息
案例:
<?phpclass Dog{private $name;private $age;private $benling;//構造方法public function __construct($name,$age,$benling){$this->name = $name;$this->age = $age;$this->benling = $benling;}//魔術方法tostring//tostring沒有形式參數//debug調試時,需要查看對象信息public function __toString(){return '小狗的名字是 '. $this->name . '年齡為 ' . $this->age . '愛好為 ' . $this->benling; }}$dog = new Dog('藏獒',5 ,'看家');//直接打印輸出會觸發toString魔術方法,如果不寫會報錯echo $dog;?>
魔術方法之__clone
當我們需要將一個對象完全的復制一份,保證兩個對象的屬性和屬性值一樣,但他們的數據空間是獨立的,則可以使用對象克隆
說明:
當我們$對象1 = $對象2時會觸發__clone方法
如果我們希望克隆,修改某個屬性則在__clone方法中去修改即可
如果我們希望阻止克隆,只需要將__clone魔術方法申明為private即可
案例:
<?phpclass Sheep{public $name;protected $food;public function __construct($name,$food){$this->name = $name;$this->food = $food;}//__clone 魔術方法//如果希望阻止克隆,則將__clone 申明為privatepublic function __clone(){//在克隆一個對象時,可以在這個__clone 函數中去修改某個屬性,如果有必要的話echo '復制一個';}}$sheep1 = new Sheep('喜羊羊', '灰太狼');//對象克隆會觸發__clone的魔術方法,克隆只是值拷貝$sheep2 = clone $sheep1;if($sheep1==$sheep2){echo '相等';}if($sheep1===$sheep2){echo '全等';}
魔術方法之__call函數
當我們調用要給不可訪問的成員方法時,__call魔術方法就會被調用(不可訪問即該成員方法不存在,成員訪問被protected和private修飾)
__call魔術方法中,有兩個參數
函數名:$mathod
參數 類型數組:$parameters
案例:
在類的外部調用不可訪問的成員方法
<?phpheader ('content-type:text/html; charset=utf-8');class Sheep{public $name;protected $food;//構造方法public function __construct($name,$food){$this->name = $name;$this->food = $food;}//展示對象都有哪些信息public function show(){echo '
小羊的名字是 ' . $this->name;foreach($this->food as $food){echo '食物是 ' . $food;}}//定義一個受保護的方法protected function hoddy($hoddy1,$hoddy2){echo '
喜羊羊的第一個愛好是 ' . $hoddy1;echo '
喜羊羊的第二個愛好是 ' . $hoddy2;}//編寫一個__call魔術方法,__call魔術方法會接收兩個參數/*@param $mathod_name 函數名@param $parameters 就是參數,類型為array*/public function __call($method_name,$parameters){//判斷$this中是否有$method_name函數,if(method_exists($this,$method_name)){return $this->$method_name($parameters[0],$parameters[1]);}else{echo '沒調用該函數';} }}$sheep = new Sheep('喜羊羊' , array('青草','灰太狼'));$sheep->show();//當我們直接調用受保護的方法時,會觸發__call魔術方法$sheep->hoddy('玩','打灰太狼');?>
實戰:
有一個cat類,有年齡和名字兩個屬性,要求這兩個屬性全部都是public,cat類有一個方法jisuan($n1,$n2,$oper)可以計算+-*/,該方法是私有的,在類的外部$對象名->play('jisuan',$n1,$n2,$oper)得到結果,該方法在類中沒有定義
要求play是固定的,如果沒有按規定寫,則給出相應的錯誤提示
<?phpheader ('content-type:text/html; charset=utf-8');class Cat{public $name;public $age;//構造方法public function __construct($name,$age){$this->name = $name;$this->age = $age;}//定義一個jisuan方法private function jiSuan($n1,$n2 ,$oper){$res = 0;//判斷符號并計算switch($oper){case '+':$res = $n1 + $n2;break;case '-':$res = $n1 - $n2;break;case '*':$res = $n1 * $n2;break;case '/':$res = $n1 / $n2;break;default:echo '輸入的符號錯誤,請重新輸入';}return $res;}//編寫要給__call魔術方法public function __call($method_name,$parameters){//判斷是否通過play方法調用if($method_name == 'play'){//判斷jisuan()方法是否存在if(method_exists($this,$parameters[0])){return $this->$parameters[0]($parameters[1],$parameters[2],$parameters[3]);}else{echo '你調用的'.$patameters[0].'不存在';}}else{echo '你調用的方式有問題';}}}$cat = new Cat('tom',23);echo $cat->play('jiSuan',1,2,'*');
責任編輯:
總結
以上是生活随笔為你收集整理的php对象魔术方法,php学习之类与对象的魔术方法的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apache mysql 登陆_Apac
- 下一篇: 常对象与常成员