<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                1、一個對象克隆另一個對象的時候,類里邊的__clone方法自動執行。 只要一個對象一誕生,就要有初始化的動作。如果副本對象和原來的對象一模一樣就會有問題,所以,這個時候需要調用__clone()方法。__clone()里邊的$this代表副本中的對象。$that代表原對象。 class A{ public $num = 1; public function show(){ echo $this->num;//1 } function __clone(){ echo ++$this->num;//2 } } $a = new A(); $b = $a; echo intval($a===$b);//1 echo $a->show(); $b = clone $a; //echo intval($a===$b);//0,內容雖然一樣,但是在內存中的地址不同 2、實例化的對象不可以直接用echo輸出,但是如果類中有__toString方法,就可以輸出相應的信息。 class B{ private $host; private $dbname; private $user; private $pwd; function __construct($host,$dbname,$user,$pwd){ $this->host = $host; $this->dbname = $dbname; $this->user = $user; $this->pwd = $pwd; } public function connect(){ echo '連接數據庫'; } public function gettable(){ echo '獲得表名'; } public function insert(){ echo '插入數據庫'; } function __toString(){ $method = get_class_methods(__CLASS__);//獲得當前類的所有方法(數組形式) $methodString = implode('、',$method); //return $methodString;//__construct、connect、gettable、insert、__toString $vars = get_object_vars($this);//獲得當前對象的所有屬性(數組形式) $varsString = implode('、',$vars); return $varsString;//localhost、mydb、admin、admin } } $b = new B('localhost','mydb','admin','admin'); echo $b;//如果類中沒有__toString方法會報錯 如果沒有toString()方法,直接輸出對象對發生致命性錯誤。 輸出對象時應注意:echo或print_r函數后面直接跟輸出的對象,中間不要加其他多余的字符,否則__toString()方法不會被執行,例如這種情況:echo '輸出對象'.$obj; 3、實例化的對象執行沒有定義的方法或無權限訪問的方法會報錯,但是通過__call方法可以避免報錯,并輸出一些提示信息! class C{ public function show(){ echo 'show'; } function __call($methodName/*方法名*/,$args/*參數*/){ echo $methodName; } } $c = new C(); $c->go(); 4、__get():當我們調用一個權限上不允許調用的屬性或不存在的屬性時,__get魔術方法會自動調用,并且自動傳參,參數值是屬性名。 class Person{ public $name = 'fxxy'; protected $age = 23; private $sex = 'man'; function __get($var){ echo '你想訪問我的'.$var.'屬性'; } } $person = new Person(); echo $person->name;//fxxy echo $person->age;//你想訪問我的age屬性 echo $person->sex;//你想訪問我的sex屬性 echo '<pre/>'; print_r($person); 5、__set():當我們給一個權限上不允許直接訪問或者是不存在的屬性設置屬性值時,__set魔術方法會自動調用,并且自動傳參,第一個參數數屬性名,第二個參數是屬性值。 class Person{ public $name; protected $age; private $sex; public function __set($a,$b){ echo '你想給我的'.$a.'賦值'.'并且值是'.$b.'<br/>'; } } $person = new Person(); $person->name = 'fxxy';//fxxy $person->age = '28';//你想給我的age賦值并且值是28 $person->sex = 'man';//你想給我的sex賦值并且值是man echo $person->name.'<br/>'; 6、用isset()判斷某個某個屬性屬性是否存在時,__isset()自動執行。 用unset()清除一個權限上不允許訪問或者是不存在的屬性時,__unset()自動執行。 class Person{ public $name = 'fxxy'; protected $age = '28'; private $sex = 'man'; function __isset($a){ echo '你想判斷我的'.$a.'值是否存在'.'<br/>'; } function __unset($b){ echo '你想刪除我的'.$b.'屬性值'.'<br/>'; } } $person = new Person(); if(isset($person->name)){ echo $person->name.'<br/>'; } if(isset($person->sex)){ echo '有這個值'.'<br/>'; }else{ echo '沒有這個值'.'<br/>'; } unset($person->age); /* //運行結果如下: fxxy 你想判斷我的sex值是否存在 沒有這個值 你想刪除我的age屬性值 */ 7、__sleep():在使用serialize()函數時,如果實例化的對象包含__sleep()方法,則會先執行__sleep()方法,這個方法返回一個數組,數組元素就是類屬性,可以包括全部的類屬性,也可以隨便包括其中的幾個。 __wakeup():unserialize()函數可以重新還原一個被serialize()函數序列化的對象,__wakeup()方法則是恢復在序列中可能丟失的數據庫連接及相關工作! class Person{ public $name; public $sex; private $age; public function __construct($name,$sex,$age){ $this->name = $name; $this->sex = $sex; $this->age = $age; } public function __sleep(){ return array('name','age'); } public function __wakeup(){ $age+=1; return $this->name; } } $person = new Person('fxxy','man',28); $p1 = serialize($person); echo $p1.'<br/>'; $p2 = unserialize($p1); echo $p2->name; 因為對象是存儲在內存中的,為了提高程序運行效率,當某個對象使用完成之后,就會被垃圾回收機制回收,所以它不可能永久的保存在內存中,這樣的話如果其他頁面也需要用到這個對象,就比較困難了,這個時候可以把對象利用serialiaze()方法序列化,然后保存在到一個或數據庫中,這樣的話其他頁面就可以隨時調用了,然后想要刪除這個序列化的對象也是很簡單的。 8、__autoload()方法: 其他的魔術方法都是在類中添加起作用,這是一個唯一不在類中添加的方法。 只要在頁面中使用到一個類,只要用到類名,就會自動將類名傳給__autoload()的參數。 這里用到4個文件:test.php、OneAction.class.php、TwoAction.class.php、ThreeAction.class.php。 test.php文件中的代碼是: function __autoload($className){ include $className.'.class.php'; } $one = new OneAction(); $two = new TwoAction(); $three = new ThreeAction(); OneAction.class.php文件中的代碼是: <?php class OneAction{ public function __construct(){ echo 'oneAction'.'<br/>'; } } ?> TwoAction.class.php文件中的代碼是: <?php class TwoAction{ public function __construct(){ echo 'twoAction'.'<br/>'; } } ?> ThreeAction.class.php文件中的代碼是: <?php class ThreeAction{ public function __construct(){ echo 'threeAction'.'<br/>'; } } ?> 需要注意的是:__autoload()方法中的參數是類名,當本腳本中實例化對象的時候找不到某個類,就會自動調用autoload魔術方法,所以魔術方法內部的inlude文件地址與類的名稱要相對應!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看