<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 類的屬性 在類中定義的變量稱之為屬性,通常屬性跟數據庫中的字段有一定的關聯,因此也可以稱作“字段”。屬性聲明是由關鍵字 public,protected 或者 private 開頭,后面跟一個普通的變量聲明來組成。屬性的變量可以設置初始化的默認值,默認值必須是常量。 訪問控制的關鍵字代表的意義為: public:公開的 protected:受保護的 private:私有的 ~~~ class Car { //定義公共屬性 public $name = '汽車'; //定義受保護的屬性 protected $corlor = '白色'; //定義私有屬性 private $price = '100000'; } ~~~ **默認都為public,外部可以訪問。一般通過->對象操作符來訪問對象的屬性或者方法,對于靜態屬性則使用::雙冒號進行訪問。當在類成員方法內部調用的時候,可以使用$this偽變量調用當前對象的屬性。** $car = new Car(); echo $car->name; //調用對象的屬性 echo $car->color; //錯誤 受保護的屬性不允許外部調用 echo $car->price; //錯誤 私有屬性不允許外部調用 受保護的屬性與私有屬性不允許外部調用,在類的成員方法內部是可以調用的。 ~~~ class Car{ private $price = '1000'; public function getPrice() { return $this->price; //內部訪問私有屬性 ? } } ~~~ ## 定義類的方法 方法就是在類中的function,很多時候我們分不清方法與函數有什么差別,在面向過程的程序設計中function叫做函數,在面向對象中function則被稱之為方法。 同屬性一樣,類的方法也具有public,protected 以及 private 的訪問控制。 訪問控制的關鍵字代表的意義為: public:公開的 protected:受保護的 private:私有的 我們可以這樣定義方法: ~~~ class Car { public function getName() { return '汽車'; } ?} $car = new Car(); echo $car->getName(); ~~~ **使用關鍵字static修飾的,稱之為靜態方法,靜態方法不需要實例化對象,可以通過類名直接調用,操作符為雙冒號::。** ~~~ class Car { public static function getName() { return '汽車'; } ?} echo Car::getName(); //結果為“汽車” ~~~ ## 構造函數和析構函數 PHP5可以在類中使用__construct()定義一個構造函數,具有構造函數的類,會在每次對象創建的時候調用該函數,因此常用來在對象創建的時候進行一些初始化工作。 ~~~ class Car { function __construct() { print "構造函數被調用\n"; } } $car = new Car(); //實例化的時候 ~~~ 會自動調用構造函數__construct,這里會輸出一個字符串 在子類中如果定義了__construct則不會調用父類的__construct,如果需要同時調用父類的構造函數,需要使用parent::__construct()顯式的調用。 ~~~ class Car { function __construct() { print "父類構造函數被調用\n"; } } class Truck extends Car { function __construct() { print "子類構造函數被調用\n"; parent::__construct(); } } $car = new Truck(); ~~~ 同樣,PHP5支持析構函數,使用__destruct()進行定義,析構函數指的是當某個對象的所有引用被刪除,或者對象被顯式的銷毀時會執行的函數。 ~~~ class Car { function __construct() { print "構造函數被調用 \n"; } function __destruct() { print "析構函數被調用 \n"; } } $car = new Car(); //實例化時會調用構造函數 echo '使用后,準備銷毀car對象 \n'; unset($car); //銷毀時會調用析構函數 ~~~ 當PHP代碼執行完畢以后,會自動回收與銷毀對象,因此一般情況下不需要顯式的去銷毀對象。 ## Static靜態關鍵字 靜態屬性與方法可以在不實例化類的情況下調用,直接使用類名::方法名的方式進行調用。靜態屬性不允許對象使用->操作符調用。 ~~~ class Car { private static $speed = 10; public static function getSpeed() { return self::$speed; } } echo Car::getSpeed(); //調用靜態方法 ~~~ 靜態方法也可以通過變量來進行動態調用 ~~~ $func = 'getSpeed'; $className = 'Car'; echo $className::$func(); //動態調用靜態方法 ~~~ 靜態方法中,**$this偽變量不允許使用。可以使用self,parent,static在內部調用靜態方法與屬性。** ~~~ class Car { private static $speed = 10; public static function getSpeed() { return self::$speed; } public static function speedUp() { return self::$speed+=10; } } class BigCar extends Car { public static function start() { parent::speedUp(); } } BigCar::start(); echo BigCar::getSpeed(); ~~~ ## 訪問控制 前面的小節,我們已經接觸過訪問控制了,訪問控制通過關鍵字public,protected和private來實現。被定義為公有的類成員可以在任何地方被訪問。被定義為受保護的類成員則可以被其自身以及其子類和父類訪問。被定義為私有的類成員則只能被其定義所在的類訪問。 類屬性必須定義為公有、受保護、私有之一。為兼容PHP5以前的版本,如果采用 var 定義,則被視為公有。 ~~~ class Car { $speed = 10; //錯誤 屬性必須定義訪問控制 public $name; //定義共有屬性 } ~~~ 類中的方法可以被定義為公有、私有或受保護。如果沒有設置這些關鍵字,則該方法默認為公有。 ~~~ class Car { ? //默認為共有方法 function turnLeft() { } } ~~~ 如果構造函數定義成了私有方法,則不允許直接實例化對象了,這時候一般通過靜態方法進行實例化,在設計模式中會經常使用這樣的方法來控制對象的創建,比如單例模式只允許有一個全局唯一的對象。 ~~~ class Car { private function __construct() { echo 'object create'; } private static $_object = null; public static function getInstance() { if (empty(self::$_object)) { self::$_object = new Car(); //內部方法可以調用私有方法,因此這里可以創建對象 } return self::$_object; } } //$car = new Car(); //這里不允許直接實例化對象 $car = Car::getInstance(); //通過靜態方法來獲得一個實例 ~~~ ## 對象繼承 繼承是面向對象程序設計中常用的一個特性,汽車是一個比較大的類,我們也可以稱之為基類,除此之外,汽車還分為卡車、轎車、東風、寶馬等,因為這些子類具有很多相同的屬性和方法,可以采用繼承汽車類來共享這些屬性與方法,實現代碼的復用。 ## 重載 PHP中的重載指的是動態的創建屬性與方法,是通過魔術方法來實現的。屬性的重載通過__set,__get,__isset,__unset來分別實現對不存在屬性的賦值、讀取、判斷屬性是否設置、銷毀屬性。 ~~~ class Car { private $ary = array(); public function __set($key, $val) { $this->ary[$key] = $val; } public function __get($key) { if (isset($this->ary[$key])) { return $this->ary[$key]; } return null; } public function __isset($key) { if (isset($this->ary[$key])) { return true; } return false; } public function __unset($key) { unset($this->ary[$key]); } } $car = new Car(); $car->name = '汽車'; //name屬性動態創建并賦值 echo $car->name; ~~~ 方法的重載通過__call來實現,當調用不存在的方法的時候,將會轉為參數調用__call方法,當調用不存在的靜態方法時會使用__callStatic重載。 ~~~ class Car { public $speed = 0; public function __call($name, $args) { if ($name == 'speedUp') { $this->speed += 10; } } } $car = new Car(); $car->speedUp(); //調用不存在的方法會使用重載 echo $car->speed; ~~~ ## 對象的高級特性 對象比較,當同一個類的兩個實例的所有屬性都相等時,可以使用比較運算符==進行判斷,當需要判斷兩個變量是否為同一個對象的引用時,可以使用全等運算符===進行判斷。 ~~~ class Car { } $a = new Car(); $b = new Car(); if ($a == $b) echo '=='; //true if ($a === $b) echo '==='; //false ~~~ 對象復制,在一些特殊情況下,可以通過關鍵字clone來復制一個對象,這時__clone方法會被調用,通過這個魔術方法來設置屬性的值。 ~~~ class Car { public $name = 'car'; public function __clone() { $obj = new Car(); $obj->name = $this->name; } } $a = new Car(); $a->name = 'new car'; $b = clone $a; var_dump($b); ~~~ 對象序列化,可以通過serialize方法將對象序列化為字符串,用于存儲或者傳遞數據,然后在需要的時候通過unserialize將字符串反序列化成對象進行使用。 ~~~ class Car { public $name = 'car'; } $a = new Car(); $str = serialize($a); //對象序列化成字符串 echo $str.'<br>'; $b = unserialize($str); //反序列化為對象 var_dump($b); ~~~
                  <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>

                              哎呀哎呀视频在线观看