<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國際加速解決方案。 廣告
                # 面向對象 > 創作不易,轉載請注明出處: 后盾人 @ houdurnen.com ## 歷史 早期編程由于受電腦硬件限制,程序都是追求效率,而忽略可理解性,擴充性,隨著硬件技術的發展,編程越來越重視多人開發,程序員越來越重視程序的可靠性,可擴展性,可維護性,所以刺激了程序語言的發展 面向過程 - 程序員設計好程序代碼流程圖,輔助程序設計。優點:用什么功能就編寫什么函數 缺點:數據管理上比較混亂 ,主要集中在函數成面上,面向對象把屬性和方法進行封裝,更好的可重用性和可擴展性 面向對象 - 萬物皆對象,將構成問題的事務分解到各個對象上,建立對象的目的不是為了完成一個工作,而是為了描述某個事務在解決問題中的行為,更符合人的思維習慣,代碼重用性高,可擴展性好 > 面向對象和面向過程的核心區別是如何分配職責。 ## 類和對象 面向對象是由一系統具有屬性和方法的對象構成,對象之間相互交互 ,從而實現業務需求。 屬性 - 在類中定義的變量,即為成員屬性,用于描述對象靜態特性的數據。如人的姓名,性別,首字母小寫 方法 - 函數定義在類中即為成員方法,用于描述對象動態特性的操作行為,方法名不區分大小寫,不可重名,首字母小寫 對象生命周期 - 創建后,生命周期開始,當程序結束后或程序員清除對象后即銷毀,PHP會自動銷毀對象 類是一種抽象的概念,是具有相同語義定義對象的集合(具有相同屬性和方法的集體),使用具體的類是不可行的,只能實例化。拿汽車舉例,汽車的設計圖紙就是類,汽車是對象。設計中重點是類的創建 類名書寫規范 - 類名首字母大寫 - 一個類定義在一個文件中 ### $this 對象中使用 `$this` 指針可以訪問屬性或方法。 ``` class Code { protected $len = 5; public function make() { return $this->len . $this->show(); } public function show() { return ' : is show'; } } echo (new Code)->make(); ``` ## 繼承 通過使用 `extends` 可以繼承父類的屬性與方法,在PHP中繼承是單一的。 ``` class Notify { public function message() { return 'notify message'; } } class User extends Notify { } echo (new User)->message(); ``` ### 父類調用 子類可以使用 `parent` 關鍵字調用父類方法 ``` ... public function message() { return parent::message(); } ... ``` ### 方法重寫 子類可以重寫父類的方法,除非父類的方法沒有使用 `final` 修飾。 ``` class Notify { public function message() { return 'notify message'; } } class User extends Notify { public function message() { return 'user notify'; } } echo (new User)->message(); ``` ### 禁止重寫 使用final聲明的方法,將禁止在子類中重寫父類方法。 ``` public final function message() { return 'notify message'; } ``` ## 封裝 public 公有 - 在類的內部與外部或子類都可以訪問,是最開放的權限 private 私有 - 定義類的屬性和方法,在類的內部可以訪問,在類的外部或子類都不可以訪問 protected 受保護 - 定義類的屬性和方法,在類的內部或子類可以訪問,類的外部不可以訪問 模塊設計 - 強內聚(功能盡量在類的內部完成),弱耦合(開放盡量少的方法給外部調用)。例:公司銷售接項目,具體工作交給公司內部程序員,設計人員,服務器管理人員協同完成 ## trait 使用`trait` 機制可以變相的使用多重繼承。 ``` class Alipay { use Pay; } class WePay { use Pay; } trait Pay { public function sn() { return 'ABCDEF'; } } echo (new WePay)->sn(); ``` 如果本類與 trait 中存在同名的屬性和方法時,將使用本類中的屬性與方法。 ``` ... class WePay { use Pay; public function sn() { return __METHOD__; } } trait Pay { public function sn() { return 'ABCDEF'; } } ... ``` ### 多個trait 可以使用多個 `trait` 用逗號連接 ``` ... use Pay,Site; ... ``` ### 解決沖突 ``` class WePay { use Pay, Email { Pay::notify insteadof Email; Email::notify as EmailNotify; } trait Pay { public function notify() { return __METHOD__; } } trait Email { public function notify() { return __METHOD__; } } echo (new WePay)->notify(); ``` `Pay::notify insteadof Email` 表示使用 `Pay::notify` 方法替代 `Email::notify` 方法。 `Email::notify as EmailNotify` 將`Email:notify` 別名為 `EmailNotify` ### 訪問控制 可以為繼承的 trait 方法重新定義訪問控制 ``` class WePay { use Pay, Email { Pay::notify insteadof Email; Email::notify as protected EmailNotify; ... } ``` ### 多重trait 可以通過多個`trait` 組合來使用。 ``` trait Notify { public function response() { return 'notify response'; } } trait Pay { use Notify; } class User { use Pay; } echo (new User)->response(); ``` ### 抽象方法 ``` trait Notify { public function response() { return 'notify response' . $this->sn(); } abstract protected function sn(); } trait Pay { use Notify; } class User { use Pay; protected function sn() { return 'SN999'; } } echo (new User)->response(); ``` ### 靜態方法 在 `trait` 中可以使用靜態方法、抽象方法、靜態屬性。 ``` ... trait Pay { public function sn() { return 'ABCDEF'; } public static function notify() { return __METHOD__; } } class WePay { use Pay; ... } echo WePay::notify(); ``` ## static static: - 需要一個數據對象只服務于類,即類內部可用,對外不可用時。建對象是極其耗費資源的,因此當一個方法具有比較強的公用性的時候,沒有必要為了調用這個方法而重新再生成該類的實例。定義的方法或變量在程序第一次加載時即駐留內存,程序結束釋放。 static變量: - 通過static聲明的成員變量為靜態變量或叫類變量,是該類的公共變量,在第一次使用時即生成,對于該類的所有對象只有一份,是屬于類的,不是屬于對象的。static變量是屬于類而不屬于對象,可以在任何地方通地類來訪問,是類的全局變量,類創建時即存入內存。對多個對象來說,靜態數據成員只存儲一處,可以節省內存。只要對靜態數據成員的值更新一次,保證所有對象存取更新后的相同的值。 static方法: - 用static聲明的方法為靜態方法或叫類方法,執行該方法時不會將對象引用傳給函數,所以我們不能訪問非靜態成員,只能訪問靜態方法或靜態變量。只能使用關于類的方式如self static parent等。使用時不用生成對象即可執行 ## 類常量 使用 `const` 來定義類常量,常量使用 `self::`來調用。 ``` class Model implements ArrayAccess, Iterator { use ArrayIterator, Relation, Validate, Auto, Filter; //----------自動驗證---------- //有字段時驗證 const EXIST_VALIDATE = 1; //值不為空時驗證 const NOT_EMPTY_VALIDATE = 2; ... } ``` ## $this self:: parent:: $this - 是當前對象的引用, 一般出現在方法里,用于獲取類的成員屬性,或執行類的成員方法 self:: - 對本類的引用 ,用于獲取當前類的表態成員屬性或靜態成員方法self::run() parent:: - 對父類的引用,調用父類的方法或屬性。 ## 魔術方法 ### 構造方法&析構方法 構造方法__construct() - 在創建對象時自動執行,沒有返回值,用于執行類的一些初始化工作,如對象屬性的初始化工作,構造方法為__construct()。 - 可以在構造方法中傳遞參數,用于定義屬性,在父類和子類都定義構造方法時,執行子類的構造方法 析構方法__destruct(): - 當所有對象的引用被銷毀時執行。 ### \_\_get 與\_\_set 讀取不可訪問或不存在的屬性時,\__get() 會被調用,同理獲取不可訪問或不存的的屬性時會執行 \__set() 方法。 ``` <?php abstract class Query { abstract protected function record(array $data); public function select() { return $this->record(['name' => '后盾人', 'age' => 33]); } } class Model extends Query { protected $field = [ 'name' ]; public function all(){ $this->select(); return $this->field; } protected function record(array $data) { $this->field = $data; } public function __get($name) { return $this->field[$name] ?? null; } public function __set($name, $value) { $this->field[$name] = $value; } } $user = new Model; $user->all(); echo $user->name; $user->name = '向軍大叔'; echo $user->name;ry ``` \### __isset() 與 \__unset() 當使用 isset()函數或者empty()函數 判斷屬性是否存在或者是否為空的時候會自動觸發。 當使用 unset() 函數判斷屬性時,如果存在\__unset() 方法將會執行。 ``` ... public function __unset($name) { if (!isset($this->field[$name]) || in_array($name, $this->deny)) { throw new Exception('禁止操作'); } } public function __isset($name) { return isset($this->field[$name]); } ... ``` ## 抽象類&抽象方法 具有抽象方法的類為抽象類,抽象方法即為沒有內容的空方法,要求子類進行完善內容,抽象類不能實例化,只能繼承,通過extends來實現,抽象類中也可以定義普通方法 父類方法執行方式不確定,但子類還都有這個方法 - 例1:如交通工具類:定義抽象方法控制交通工具運行方式,這樣每個交通工具如飛機,汽車都要重寫父類方法。如果在父類工具類定義該方法(比如在地上走)沒有任何意義,因為每個交通工具都要重寫(飛機要重寫方法,船要重寫方法),所以針對你類方法的不確定性,我們需要抽象方法,實現多態。 例2:定義動物類,每個動物都有叫聲方法,但是表面不同,所以要定義為抽象類,讓每種動物類去實現功能。 - 當父類為抽象類時,子類必須重寫父類的抽象方法 - 抽象類里不一定非要寫抽象方法,但有抽象方法的類必須定義為抽象類 - 抽象類必須繼承使用 - 抽象方法不能有主體即{} - ``` <?php abstract class AbstractClass { // 強制要求子類定義這些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue(); } } ``` ## 接口 接口是一組成員聲明方法的集合,包含空的成員方法和常量,空的方法要求繼承類去具體實現。成員方法為public,屬性為常量。 - - 例如:現實中的電腦USB或PCI插槽,插線板等都有接口例子 繼承是一級一級層次式,如果某一層出現問題,整個繼承就會出現意外。而接口只影響實現接口的類,接口可以在破壞原來的繼承基礎上對類擴展。接口可以實現多繼承。 - 例:電腦USB接口,規定各個廠商必須構造合適的接口方法,比如手機,數碼相機,網銀U盾。要讓各個廠商寫自己的方法如U盾插到USB上他會自動安裝網銀驅盾,彈出網頁,手機裝上后可以打開手機里的內容,同時可以充電 抽象類及普通類都可以實現接口,通過關鍵字implements 接口與抽象類的區別: - 1 接口只能用implements實現 抽象類用extends繼承實現 2 接口沒有數據成員,可以定義常量,抽象類可以有 3 接口沒有構造函數,抽象類可以定義構造函數 4 接口方法都是public 抽象類方法可以用protected private public來修飾 5 一個類可以實現多個接口,但只能繼承一個抽象類 6 接口中不可以有成員方法,抽象類可以有成員方法 ``` interface DbInterface { public function connectDb(); //獲得連接 參數為表名 public function close(); //關閉數據庫 public function exe($sql); //發送沒有返回值的sql public function query($sql); //有返回值的sql } class Db implements DbInterface { public function exe($sql){ } public function query($sql{ } } ```
                  <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>

                              哎呀哎呀视频在线观看