<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國際加速解決方案。 廣告
                [TOC] # 面向對象 面向對象存在問題是越來越多的語言引入函數式編程的特征,如閉包,回調等,php也引入了一些 ## 類 一個類的設計需要能充分展示其最重要的屬性和方法,并且能與其他事物區分.只有類本身有意義,從抽象到具體的實例化才有意義 類是屬性和方法的集合,那么在php里,對象是什么?比較普遍的說法是:"對象由屬性和方法組成". 對象由屬性組成,一個對象的屬性是它區別于另一個對象的關鍵所在 由于**php對象是用數組來模擬的**,因此我們把對象轉為數組,就能看到這個對象所擁有的屬性了 序列化后的對象會附帶所屬類名,這個類名保證此對象能夠在執行類的方法(也就是自己能執行的方法)時,可以正確找到方法所在的代碼空間(即對象所擁有的方法存儲在類里). 另外,當一個對象的實例變量引用其他對象時,序列化該對象時也會引用對象進行序列化 類和對象是不可分割的,有對象就必定有一個類和其對應,否則這個對象也就成了沒有親人和孩子(但有一個特殊情況,就是由標量進行強制類型轉換的object,沒有一個類和他對應.此時,php中一個稱為孤兒的stdclass類就會收留這個對象 ## 重載 php的重載和java等語言的重載不同.java里重載指一個類可以定義參數列表不同但名字想太多多個方法.比如,java也有構造函數,java允許多個構造函數,只要保證方法簽名不一樣就行,而php則在一個類里只允許有一個構造函數 php提供的重載指動態的創建類屬性和方法.因此`__set和__get`被歸類到重載這里 java中構造方法比php好用,php由于有了`__set和__get`,這個魔術方法,使得動態增加對象的屬性字段變得很方便,而對java來說,要實現類似的效果,就不得不借助反射API或直接修改編譯后字節碼的方式來實現 ## 繼承和多態 **繼承和多態都是對類的復用,他們一個是類級別的復用,一個是方法級別的復用** 用parent自帶父類,用self指代自身用`::`運算符(范圍解析操作符)調用父類的方法. `::`操作符還用來作為類常量和靜態方法調用 多態的確切含義是:同一個類的對象收到相同消息時,會得到不同的結果.而這個消息是不可預測的.多態顧名思義,就是多種狀態,也就是多種結果 **重載并不是面向對象里的東西,和多態也不是一個概念,它屬于多態的一個表現形式** --- php是弱類型的,并且也沒有對象轉型的機制,所以不能像c++或者java那樣實現 ~~~ father $pf = new son; ~~~ 把派生類對象賦給基類對象,然后在調用函數時動態改變其指向 在php中,對象都是確定的,是不同類的對象 --- **區別在于多態關鍵在于看對象是否屬于同一類型.如果把他們看作同一類型,調用相同函數,返回了不同結果,那么他們就是多態;否則,不能稱為多態** --- 注意 類型轉換不是多態 php中父類和子類看作"繼父"和"繼子"關系,但不存在血緣關系.因此子類無法向上轉型為父類,從而失去多態最典型的特征 **多態的本質就是if...else,只不過實現的層級不同** ## 繼承和組合 `繼承是一種"是,像"的關系,而組合是一種"需要"關系` 可以很簡單的判斷出父親和兒子應該是繼承關系,父親與家庭是組合關系 **組合偏重整體與局部關系,而繼承側重父與子的關系** ![](https://box.kancloud.cn/c92d8dbb19e7fb683a0ee76cbdf7427f_1346x486.png) 注意: 子類是一個特殊類型,不是父類的一個角色 **底層代碼多用組合,頂層/業務代碼多用繼承.底層用組合可以提高效率,避免對象臃腫.頂層代碼用繼承可以提高靈活性,讓業務使用更方便** --- **繼承并非一無視處,而組合也并不是完美無缺.如果既要組合的靈活,又要繼承的代碼簡潔,能做到嗎?** 這個可以做到,比如多繼承,c++就是使用這種模型來增強繼承的靈活性的 多重繼承太復雜,那么還有其他方式能比較好的解決這個問題嗎? traits就是一種很好的解決方案
                  <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>

                              哎呀哎呀视频在线观看