日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

php对象魔术方法,php学习之类与对象的魔术方法的使用

發(fā)布時(shí)間:2024/9/27 php 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php对象魔术方法,php学习之类与对象的魔术方法的使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(biāo)題:php學(xué)習(xí)之類與對(duì)象的魔術(shù)方法的使用

魔術(shù)方法有哪些

__construct:構(gòu)造方法

__destuct:析構(gòu)方法

__call:在對(duì)象中調(diào)用一個(gè)不可訪問(wèn)的方法時(shí)。__call()會(huì)被調(diào)用

__callStatic:

__get:調(diào)用不可訪問(wèn)的屬性

__set:給不可訪問(wèn)的屬性賦值或修改值

__isset:

__unset:

__sleep:串行化的時(shí)候用,涉及到序列化

__wakeup:反串行化的時(shí)候用,涉及到序列化

__toString:

__set_state:

__clone:對(duì)象克隆前被調(diào)用

說(shuō)明:

魔術(shù)方法都是系統(tǒng)提供的

所有的魔術(shù)方法,前面都是以__兩個(gè)下劃線

我們?cè)谧远x函數(shù)時(shí),不建議已經(jīng)能用兩個(gè)_開(kāi)始

魔術(shù)方法是在滿足某個(gè)條件時(shí),系統(tǒng)自動(dòng)調(diào)用

訪問(wèn)控制修飾符的基本知識(shí)

訪問(wèn)修飾符包括:

public:公有,被定義該修飾的成員可以在任何地方被訪問(wèn)

protected:受保護(hù)的,被定義該修飾符的成員可以被自身及其子類和父類訪問(wèn)

private:私有。被定義該修飾符的成員只能被其定義所在的類中訪問(wèn)

訪問(wèn)修飾符既可以修飾成員屬性,也可以修飾成員方法

訪問(wèn)protected,private不可以直接訪問(wèn),解決方法是編寫(xiě)一個(gè)public的成員方法,來(lái)操作protected和private屬性

<?phpclass Person{public $name;protected $age;private $sex;//構(gòu)造方法public function __construct ($name,$age,$sex){$this->name = $name;$this->age = $age;$this->sex = $sex;} //訪問(wèn)protected屬性public function get_age(){return $this->age;} //訪問(wèn)private屬性public function get_sex(){return $this->sex;}}//創(chuàng)建對(duì)象$p1 = new Person('張三',23,'男');//訪問(wèn)各個(gè)屬性//訪問(wèn)公共屬性public ,則可以直接訪問(wèn)echo $p1->name;//訪問(wèn)protected,不可以直接訪問(wèn),解決方法是編寫(xiě)一個(gè)public的成員方法,來(lái)操作protected屬性echo $p1->get_age();//訪問(wèn)private,不可以直接訪問(wèn),解決方法是編寫(xiě)一個(gè)public的成員方法,來(lái)操作private屬性echo $p1->get_sex();

魔術(shù)方法之 __get函數(shù)和__set函數(shù)

當(dāng)開(kāi)發(fā)者去使用不可以訪問(wèn)的屬性時(shí),系統(tǒng)就會(huì)調(diào)用__get方法

不可訪問(wèn)的屬性指:

屬性不存在

直接訪問(wèn)protected屬性

直接訪問(wèn)private屬性

當(dāng)去給不可訪問(wèn)的屬性直接賦值時(shí),系統(tǒng)會(huì)調(diào)用__set方法

案例:

成員屬性不可訪問(wèn)或者被私有,希望用對(duì)象名->變量名來(lái)賦值和取值

<?php class Monkey{public $name;protected $food;//構(gòu)造方法,public function __construct($name,$food){$this->name = $name;$this->food = $food;}//魔術(shù)方法—__get()//$monkey_name代表形參,傳過(guò)來(lái)的被私有或者受保護(hù)的屬性名這里指的是$foodpublic function __get($monkey_name){//做一個(gè)判斷if(property_exists($this,$monkey_name)){return $this->$monkey_name;}else{return '沒(méi)有該屬性值';}}//魔術(shù)方法- __set()public function __set($monkey_name,$monkey_val){if(property_exists($this,$monkey_name)){$this->$monkey_name = $monkey_val;}else{return '該屬性不存在';}}}//創(chuàng)建對(duì)象$monkey1 =new Monkey('小白','胡蘿卜');echo $monkey1->name;echo $monkey1->food;//修改屬性值$monkey1->name = '程序猿';//公共屬性直接可以修改賦值echo $monkey1->name;//默認(rèn)protected的屬性賦值時(shí),會(huì)調(diào)用set方法$monkey1->food = '夜宵';$monkey1->food;

魔術(shù)方法之 __isset和__unset方法

當(dāng)對(duì)不可訪問(wèn)的屬性進(jìn)行isset($對(duì)象名->屬性),empty($對(duì)象名->屬性)操作時(shí),系統(tǒng)就會(huì)調(diào)用__isset函數(shù)

當(dāng)對(duì)不可訪問(wèn)的屬性進(jìn)行unset($對(duì)象名->屬性),系統(tǒng)就會(huì)調(diào)用__unset()函數(shù)

案例:unset($house->name);//Fatal error: Cannot access private property House::$name in D:\wamp64\www\issetunset.php on line 40

直接訪問(wèn)會(huì)提示不能調(diào)用被私有的屬性,此時(shí)會(huì)自動(dòng)調(diào)用__unset()魔術(shù)方法,在魔術(shù)方法中執(zhí)行刪除,然在打印,就會(huì)被刪除掉

<?php //定義一個(gè)房子類Houseclass House {//定義三個(gè)成員屬性,價(jià)格Price、地址add、姓名name其中姓名私有privatepublic $price;public $add;private $name;//定義構(gòu)造方法public function __construct ($price,$add,$name){$this->price = $price;$this->add = $add;$this->name =$name;//魔術(shù)方法}public function __isset($name1){//property_exists()判斷對(duì)象的屬性或方法是否存在if(property_exists($this,$name1)){echo '存在';}else{echo 2;}}//魔術(shù)方法—__unset()public function __unset($name){//判斷成員屬性是否存在if(property_exists($this,$name)){unset($this->$name);}else{echo '不存在';}}}$house = new House(1000,'陜西西安','張三');//直接調(diào)用name返回的是2,被私有了無(wú)法賦值,用isset判斷時(shí)要想用$對(duì)象名->屬性名訪問(wèn),就要使用魔術(shù)方法__isset(); if(isset($house->name)){echo $house->name;}else{echo 2;}//add屬性是公開(kāi)的,所以可以直接打印出來(lái)值if(isset($house->add)){echo $house->add;}else{echo 2;}//unset()銷毀成員屬性u(píng)nset($house->name);//Fatal error: Cannot access private property House::$name in D:\wamp64\www\issetunset.php on line 40直接訪問(wèn)會(huì)提示不能調(diào)用被私有的屬性,此時(shí)會(huì)自動(dòng)調(diào)用__unset()魔術(shù)方法,在魔術(shù)方法中執(zhí)行刪除,然在打印,就會(huì)被刪除掉var_dump($house);?>

魔術(shù)方法之__toString

當(dāng)我們希望將一個(gè)對(duì)象當(dāng)作字符串輸出時(shí),就會(huì)觸發(fā)__toString魔術(shù)方法

魔術(shù)方法tostringtostring沒(méi)有形式參數(shù)debug調(diào)試時(shí),需要查看對(duì)象信息

案例:

<?phpclass Dog{private $name;private $age;private $benling;//構(gòu)造方法public function __construct($name,$age,$benling){$this->name = $name;$this->age = $age;$this->benling = $benling;}//魔術(shù)方法tostring//tostring沒(méi)有形式參數(shù)//debug調(diào)試時(shí),需要查看對(duì)象信息public function __toString(){return '小狗的名字是 '. $this->name . '年齡為 ' . $this->age . '愛(ài)好為 ' . $this->benling; }}$dog = new Dog('藏獒',5 ,'看家');//直接打印輸出會(huì)觸發(fā)toString魔術(shù)方法,如果不寫(xiě)會(huì)報(bào)錯(cuò)echo $dog;?>

魔術(shù)方法之__clone

當(dāng)我們需要將一個(gè)對(duì)象完全的復(fù)制一份,保證兩個(gè)對(duì)象的屬性和屬性值一樣,但他們的數(shù)據(jù)空間是獨(dú)立的,則可以使用對(duì)象克隆

說(shuō)明:

當(dāng)我們$對(duì)象1 = $對(duì)象2時(shí)會(huì)觸發(fā)__clone方法

如果我們希望克隆,修改某個(gè)屬性則在__clone方法中去修改即可

如果我們希望阻止克隆,只需要將__clone魔術(shù)方法申明為private即可

案例:

<?phpclass Sheep{public $name;protected $food;public function __construct($name,$food){$this->name = $name;$this->food = $food;}//__clone 魔術(shù)方法//如果希望阻止克隆,則將__clone 申明為privatepublic function __clone(){//在克隆一個(gè)對(duì)象時(shí),可以在這個(gè)__clone 函數(shù)中去修改某個(gè)屬性,如果有必要的話echo '復(fù)制一個(gè)';}}$sheep1 = new Sheep('喜羊羊', '灰太狼');//對(duì)象克隆會(huì)觸發(fā)__clone的魔術(shù)方法,克隆只是值拷貝$sheep2 = clone $sheep1;if($sheep1==$sheep2){echo '相等';}if($sheep1===$sheep2){echo '全等';}

魔術(shù)方法之__call函數(shù)

當(dāng)我們調(diào)用要給不可訪問(wèn)的成員方法時(shí),__call魔術(shù)方法就會(huì)被調(diào)用(不可訪問(wèn)即該成員方法不存在,成員訪問(wèn)被protected和private修飾)

__call魔術(shù)方法中,有兩個(gè)參數(shù)

函數(shù)名:$mathod

參數(shù) 類型數(shù)組:$parameters

案例:

在類的外部調(diào)用不可訪問(wèn)的成員方法

<?phpheader ('content-type:text/html; charset=utf-8');class Sheep{public $name;protected $food;//構(gòu)造方法public function __construct($name,$food){$this->name = $name;$this->food = $food;}//展示對(duì)象都有哪些信息public function show(){echo '
小羊的名字是 ' . $this->name;foreach($this->food as $food){echo '食物是 ' . $food;}}//定義一個(gè)受保護(hù)的方法protected function hoddy($hoddy1,$hoddy2){echo '
喜羊羊的第一個(gè)愛(ài)好是 ' . $hoddy1;echo '
喜羊羊的第二個(gè)愛(ài)好是 ' . $hoddy2;}//編寫(xiě)一個(gè)__call魔術(shù)方法,__call魔術(shù)方法會(huì)接收兩個(gè)參數(shù)/*@param $mathod_name 函數(shù)名@param $parameters 就是參數(shù),類型為array*/public function __call($method_name,$parameters){//判斷$this中是否有$method_name函數(shù),if(method_exists($this,$method_name)){return $this->$method_name($parameters[0],$parameters[1]);}else{echo '沒(méi)調(diào)用該函數(shù)';} }}$sheep = new Sheep('喜羊羊' , array('青草','灰太狼'));$sheep->show();//當(dāng)我們直接調(diào)用受保護(hù)的方法時(shí),會(huì)觸發(fā)__call魔術(shù)方法$sheep->hoddy('玩','打灰太狼');?>

實(shí)戰(zhàn):

有一個(gè)cat類,有年齡和名字兩個(gè)屬性,要求這兩個(gè)屬性全部都是public,cat類有一個(gè)方法jisuan($n1,$n2,$oper)可以計(jì)算+-*/,該方法是私有的,在類的外部$對(duì)象名->play('jisuan',$n1,$n2,$oper)得到結(jié)果,該方法在類中沒(méi)有定義

要求play是固定的,如果沒(méi)有按規(guī)定寫(xiě),則給出相應(yīng)的錯(cuò)誤提示

<?phpheader ('content-type:text/html; charset=utf-8');class Cat{public $name;public $age;//構(gòu)造方法public function __construct($name,$age){$this->name = $name;$this->age = $age;}//定義一個(gè)jisuan方法private function jiSuan($n1,$n2 ,$oper){$res = 0;//判斷符號(hào)并計(jì)算switch($oper){case '+':$res = $n1 + $n2;break;case '-':$res = $n1 - $n2;break;case '*':$res = $n1 * $n2;break;case '/':$res = $n1 / $n2;break;default:echo '輸入的符號(hào)錯(cuò)誤,請(qǐng)重新輸入';}return $res;}//編寫(xiě)要給__call魔術(shù)方法public function __call($method_name,$parameters){//判斷是否通過(guò)play方法調(diào)用if($method_name == 'play'){//判斷jisuan()方法是否存在if(method_exists($this,$parameters[0])){return $this->$parameters[0]($parameters[1],$parameters[2],$parameters[3]);}else{echo '你調(diào)用的'.$patameters[0].'不存在';}}else{echo '你調(diào)用的方式有問(wèn)題';}}}$cat = new Cat('tom',23);echo $cat->play('jiSuan',1,2,'*');

責(zé)任編輯:

總結(jié)

以上是生活随笔為你收集整理的php对象魔术方法,php学习之类与对象的魔术方法的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。