>構(gòu)造方法:在PHP中的構(gòu)造方法要求不能進(jìn)行構(gòu)造方法的重載,即構(gòu)造方法只有一個.function__construct($name="宋",$sex="",$age=1){//構(gòu)造方法在對象誕生時為成員屬性賦初值$this->name=$name;$this->sex=$sex;$thi' />
PHP魔術(shù)方法詳解
__construct>>
構(gòu)造方法: 在PHP中的構(gòu)造方法要求不能進(jìn)行構(gòu)造方法的重載,即構(gòu)造 方法只有一個.
function __construct($name="宋", $sex="", $age=1) { //構(gòu)造方法在對象誕生時為成員屬性賦初值
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
說明: 1. 在一個類中,它只可能有一個構(gòu)造方法.
2. 所默認(rèn)的構(gòu)造方法是public的,如果使用private的話,則會構(gòu)成單例模式.
__set方法來設(shè)置
__set()方法:這個方法用來為私有成員屬性設(shè)置值的,有兩個參數(shù),第一個參數(shù)為你要為設(shè)置值的屬性名,第二個參數(shù)是要給屬性設(shè)置的值,沒有返回值。
這個方法同樣不用我們手工去調(diào)用,它也可以做成私有的,是在直接設(shè)置私有屬性值的時候自動調(diào)用的,同樣屬性私有的已經(jīng)被封裝上
了,如果沒有__set()這個方法,是不允許的,比如:$this->name=‘zhangsan’,這樣會出錯,但是如果你在類里面加上了__set($property_name, $value)這個方法,
在直接給私有屬性賦值的時候,就會自動調(diào)用它,把屬性比如name傳給$property_name,把要賦的值“zhangsan”傳給$value,通過這個方法的執(zhí)行,達(dá)到賦值的目的。
如果成員屬性不封裝成私有的,對象本身就不會去自動調(diào)用這個方法。為了不傳入非法的值,還可以在這個方法給做一下判斷。
比如實例:
相應(yīng)的實例
private $name; //第一個成員屬性$name定義人的名子,此屬性被封裝
private $sex; //第二個成員屬性$sex定義人的性別,此屬性被封裝
private $age; //第三個成員屬性$age定義人的年齡,此屬性被封裝
//聲明魔術(shù)方法需要兩個參數(shù),真接為私有屬性賦值時自動調(diào)用,并可以屏蔽一些非法賦值
private function __set($propertyName, $propertyValue) {
if($propertyName=="sex"){ //如果第一個參數(shù)是屬性名sex則條件成立
//對于非法數(shù)據(jù)的處理
if(!($propertyValue == "男" || $propertyValue == "女")) //第二個參數(shù)只能是男或女
return; //如果是非法參數(shù)返回空,則結(jié)束方法執(zhí)行
}
if($propertyName=="age"){ //如果第一個參數(shù)是屬性名age則條件成立
if($propertyValue > 150 || $propertyValue <0) //第二個參數(shù)只能在0到150之間的整數(shù)
return; //如果是非法參數(shù)返回空,則結(jié)束方法執(zhí)行
}
//對于不需要進(jìn)行驗證的數(shù)據(jù),根據(jù)參數(shù)決定為那個屬性被賦值,傳入不同的成員屬性名,賦上傳入的相應(yīng)的值,定義賦值的方式.
$this->$propertyName = $propertyValue;
}
如調(diào)用時:
$person1=new Person("張三", "男", 20);
//自動調(diào)用了__set()函數(shù),將屬性名name傳給第一個參數(shù),將屬性值”李四”傳給第二個參數(shù)
$person1->name="李四"; 當(dāng)進(jìn)行賦值時,它會調(diào)用__set中的 $this->propertyName=$propertyValue代碼
__get()方法:這個方法用來獲取私有成員屬性值的,有一個參數(shù),參數(shù)傳入你要獲取的成員屬性的名稱,返回獲取的屬性值,這個方法不用我們手工的去調(diào)用,因為我們也可以把這個方法做成私有的方法,是在直接獲取私有屬性的時候對象自動調(diào)用的。
get方法
//在類中添加__get()方法,在直接獲取屬性值時自動調(diào)用一次,以屬性名作為參數(shù)傳入并處理
private function __get($propertyName) { //在方法前使用private修飾,防止對象外部調(diào)用
if($propertyName=="sex") { //如果參數(shù)傳入的是”sex”則條件成立
return "保密"; //不讓別人獲取到性別,以“保密”替代
} else if($propertyName=="age") { //如果參數(shù)傳入的是“age”則條件成立
if($this->age > 30) //如果對象中的年齡大于30時條件成立
return $this->age-10; //返回對象中虛假的年齡,比真實年齡小10歲
else //如果對象中的年齡不大于30時則執(zhí)行下面代碼
return $this->$propertyName; //讓訪問都可以獲取到對象中真實的年齡
} else { //如果參數(shù)傳入的是其它屬性名則條件成立
關(guān)鍵==>> return $this->$propertyName; //對其它屬性都沒有限制,可以直接返回屬性的值
}
}
說明:1.它只有一個參數(shù).就是屬性名.
2.這里的關(guān)鍵代碼 return $this->$propertyName,即為真正得到屬性值的代碼.
如代碼:
$person1=new Person("張三", "男", 40);
echo "姓名:".$person1->name."
"; 它會自動的調(diào)用,特別是__get()方法中的$person1即為$this.
>>>
關(guān)于__isset()以及__unset()函數(shù)引入的意義與作用【PHP不是已經(jīng)提供了unset和isset兩個函數(shù)嗎?】
__isset()方法: isset()是測定變量是否設(shè)定用的函數(shù),傳入一個變量作為參數(shù),如果傳入的變量存在則傳回true,否則傳回false。
那么如果在一個對象外面使用“isset()”這個函數(shù)去測定對象里面的成員是否被設(shè)定可不可以用它呢?
分兩種情況,如果對象里面成員是公有的,我們就可以使用這個函數(shù)來測定成員屬性,如果是私有的成員屬性,這個函數(shù)就不起作用了,原因就是因為私有的被封裝了,在外部不可見。
則就只能使用__isset魔術(shù)方法來完成.
同樣,對于__unset的使用也一樣.
?__isset與__unset兩個函數(shù)的應(yīng)用
//__isset()方法
private function__isset($nm)
{
echo"isset()函數(shù)測定私有成員時,自動調(diào)用<br>";
return isset($this->$nm); 這里所測試的結(jié)果為true或者是false
}
//__unset()方法
private function__unset($nm)
{
echo"當(dāng)在類外部使用unset()函數(shù)來刪除私有成員時自動調(diào)用的<br>";
unset($this->$nm);
}
推薦文章
2025-01-18
2024-11-28
2024-11-09
2024-10-25
2024-06-25
2024-01-04
2023-11-06
2023-10-30
2023-10-13
2023-10-10
穩(wěn)定
產(chǎn)品高可用性高并發(fā)貼心
項目群及時溝通專業(yè)
產(chǎn)品經(jīng)理1v1支持快速
MVP模式小步快跑承諾
我們選擇聲譽(yù)堅持
10年專注高端品質(zhì)開發(fā)聯(lián)系我們
友情鏈接: