>構造方法:在PHP中的構造方法要求不能進行構造方法的重載,即構造方法只有一個.function__construct($name="宋",$sex="",$age=1){//構造方法在對象誕生時為成員屬性賦初值$this->name=$name;$this->sex=$sex;$thi' />
  • <kbd id="qyk40"></kbd>
  • <strike id="qyk40"></strike><samp id="qyk40"><pre id="qyk40"></pre></samp>

    PHP下的魔術方法的總結

     

    __construct>>
    

     

    構造方法: 在PHP中的構造方法要求不能進行構造方法的重載,即構造 方法只有一個.

     

     

    
    

      function __construct($name="宋", $sex="", $age=1) {  //構造方法在對象誕生時為成員屬性賦初值
               $this->name=$name;
               $this->sex=$sex;
               $this->age=$age;
           }
    說明: 1. 在一個類中,它只可能有一個構造方法.
         2. 所默認的構造方法是public的,如果使用private的話,則會構成單例模式.

     

    __set方法來設置

    
    

    __set()方法:這個方法用來為私有成員屬性設置值的,有兩個參數,第一個參數為你要為設置值的屬性名,第二個參數是要給屬性設置的值,沒有返回值。
    這個方法同樣不用我們手工去調用,它也可以做成私有的,是在直接設置私有屬性值的時候自動調用的,同樣屬性私有的已經被封裝上
    了,如果沒有__set()這個方法,是不允許的,比如:$this->name=‘zhangsan’,這樣會出錯,但是如果你在類里面加上了__set($property_name, $value)這個方法,
    在直接給私有屬性賦值的時候,就會自動調用它,把屬性比如name傳給$property_name,把要賦的值“zhangsan”傳給$value,通過這個方法的執行,達到賦值的目的。
    如果成員屬性不封裝成私有的,對象本身就不會去自動調用這個方法。為了不傳入非法的值,還可以在這個方法給做一下判斷。

    比如實例:

     

    相應的實例

            private $name;       //第一個成員屬性$name定義人的名子,此屬性被封裝
            private $sex;         //第二個成員屬性$sex定義人的性別,此屬性被封裝

            private $age;         //第三個成員屬性$age定義人的年齡,此屬性被封裝

    
    

    //聲明魔術方法需要兩個參數,真接為私有屬性賦值時自動調用,并可以屏蔽一些非法賦值
           private function __set($propertyName, $propertyValue) {
             

             if($propertyName=="sex"){        //如果第一個參數是屬性名sex則條件成立

                   //對于非法數據的處理
                  if(!($propertyValue == "男" || $propertyValue == "女"))  //第二個參數只能是男或女
                       return;                //如果是非法參數返回空,則結束方法執行
               }    



               if($propertyName=="age"){        //如果第一個參數是屬性名age則條件成立
                   if($propertyValue > 150 || $propertyValue
    <0)  //第二個參數只能在0到150之間的整數
                       return;                //如果是非法參數返回空,則結束方法執行
               }

             //對于不需要進行驗證的數據,根據參數決定為那個屬性被賦值,傳入不同的成員屬性名,賦上傳入的相應的值,定義賦值的方式.
               $this-
    >$propertyName = $propertyValue;
           }

    如調用時:

        $person1=new Person("張三", "男", 20);
        //自動調用了__set()函數,將屬性名name傳給第一個參數,將屬性值”李四”傳給第二個參數
        $person1->name="李四";      當進行賦值時,它會調用__set中的 $this->propertyName=$propertyValue代碼

     

     

     

    __get()方法:這個方法用來獲取私有成員屬性值的,有一個參數,參數傳入你要獲取的成員屬性的名稱,返回獲取的屬性值這個方法不用我們手工的去調用,因為我們也可以把這個方法做成私有的方法,是在直接獲取私有屬性的時候對象自動調用的。

     

    
    

     

    get方法

    
    

    //在類中添加__get()方法,在直接獲取屬性值時自動調用一次,以屬性名作為參數傳入并處理
           private function __get($propertyName)  {    //在方法前使用private修飾,防止對象外部調用
               
               if($propertyName=="sex") {          //如果參數傳入的是”sex”則條件成立
                   return "保密";                  //不讓別人獲取到性別,以“保密”替代
             
                  } else  if($propertyName=="age") {    //如果參數傳入的是“age”則條件成立
                   if($this->age > 30)               //如果對象中的年齡大于30時條件成立
                       return $this->age-10;           //返回對象中虛假的年齡,比真實年齡小10歲
                   else                           //如果對象中的年齡不大于30時則執行下面代碼
                       return $this->$propertyName;  //讓訪問都可以獲取到對象中真實的年齡
             
                 } else {                            //如果參數傳入的是其它屬性名則條件成立
        關鍵==>>     return $this->$propertyName;      //對其它屬性都沒有限制,可以直接返回屬性的值
                }
           }


    說明:1.它只有一個參數.就是屬性名.
        2.這里的關鍵代碼
    return $this->$propertyName,即為真正得到屬性值的代碼.
    如代碼:

        $person1=new Person("張三", "男", 40);  
        echo "姓名:".$person1->name."
    ";   它會自動的調用,特別是__get()方法中的$person1即為$this.
    


     

     



     

    >>>


    關于__isset()以及__unset()函數引入的意義與作用【PHP不是已經提供了unset和isset兩個函數嗎?】
    __isset()方法: isset()是測定變量是否設定用的函數,傳入一個變量作為參數,如果傳入的變量存在則傳回true,否則傳回false
     

     

    
    

    那么如果在一個對象外面使用“isset()”這個函數去測定對象里面的成員是否被設定可不可以用它呢?
    分兩種情況,如果對象里面成員是公有的,我們就可以使用這個函數來測定成員屬性,如果是私有的成員屬性,這個函數就不起作用了,原因就是因為私有的被封裝了,在外部不可見。
    則就只能使用__isset魔術方法來完成.




    同樣,對于__unset的使用也一樣.

     

    ?__isset與__unset兩個函數的應用

    
    

    //__isset()方法
    private function__isset($nm)
    {
    echo"isset()函數測定私有成員時,自動調用
    <br>";
    return isset($this->$nm);                 這里所測試的結果為true或者是false
    }

    //__unset()方法
    private function__unset($nm)
    {
    echo"當在類外部使用unset()函數來刪除私有成員時自動調用的
    <br>";
    unset($this->$nm);
    }

     

    穩定

    產品高可用性高并發

    貼心

    項目群及時溝通

    專業

    產品經理1v1支持

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽

    堅持

    10年專注高端品質開發
    • 返回頂部
    日韩精品真人荷官无码| 久久国产精品视频| 久久九九精品国产av片国产| 国产精品亚洲不卡一区二区三区| 91手机看片国产福利精品| 亚洲AV永久无码精品放毛片| 国产一区二区精品久久91| 亚洲AV第一页国产精品| 日韩视频在线观看| 久久精品亚洲综合一品| 日韩少妇无码喷潮系列一二三| 精品国产香蕉伊思人在线在线亚洲一区二区| 四虎国产精品高清在线观看| 国产午夜精品理论片免费观看| 嫩草影院在线观看精品视频| 亚洲精品视频久久久| 久久99精品久久水蜜桃| 麻豆人妻少妇精品无码专区| 亚洲国产美女精品久久久| 久久精品丝袜高跟鞋| 无码精品人妻一区二区三区影院 | 精品无码成人片一区二区98| 国内精品久久久久影院网站| 国产大片91精品免费观看男同| 国产精品免费久久久久久久久| 久久se精品动漫一区二区三区| 青草国产精品视频。| 精品综合久久久久久蜜月| 精品亚洲国产成AV人片传媒| 日韩精品专区AV无码| 精品无码人妻一区二区三区18| 亚洲一区无码精品色| 四虎影视精品永久免费网站| 精品久久久久久无码不卡| 久久精品国产一区二区| 国产伦精品一区二区三区无广告 | 久久国产精品久久| 国产精品第一页爽爽影院| 精品亚洲成在人线AV无码| 久久久精品免费视频| 国产精品一久久香蕉国产线看观看|