奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

php語言

PHP面向對象編程之深入理解方法

時間:2025-05-05 21:17:19 php語言 我要投稿
  • 相關推薦

PHP面向對象編程之深入理解方法

  文章主要介紹了PHP面向對象編程之深入理解方法重載與方法覆蓋(多態)的相關資料,需要的朋友可以參考下

  什么是多態?

  多態(Polymorphism)按字面的意思就是“多種狀態”。在面向對象語言中,接口的多種不同的實現方式即為多態。引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作(摘自“Delphi4編程技術內幕”)。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針(沒錯這段話來自百度百科)。那么多態的作用是什么,它有什么實際開發價值呢?在實際的應用開發中,采用面向對象中的多態主要在于可以將不同的子類對象都當作一個父類來處理,并且可以屏蔽不同子類對象之間所存在的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

  下面就是PHP中多態的兩個實現

  方法重載(overload)

  重載是類的多態的一種實現。函數重載指一個標識符被用作多個函數名,且能夠通過函數的參數個數或參數類型將這些同名的函數區分開來,調用不發生混淆。即當調用的時候,雖然方法名字相同,但根據參數的不同可以自動調用相應的函數。

  class A{

  public function test(){

  echo "test1";

  }

  public function test($a){

  echo "test2";

  }

  }

  $a=new A();

  $a->test();

  $a->test($a);

  假如php直接支持方法重載的話。那么上面的例子執行后傳參和不傳參就會返回不同的值。然而php并不直接支持重載,這就意味著你如果直接按上面這樣定義的話,就會報錯的。會報什么錯呢?會報如下的錯誤。

  這意思就是不能重復定義A函數,報錯的行數也正是下面這行。

  public function test($a){

  所以說php是并不直接支持重載的。合著說了這么半天php并不支持。。別急,我說的是并不直接支持,所以說是我們可以讓php間接支持。這時候就要用到一個函數來支持重載了。就是__call()。__call()方法必須帶有兩個參數。第一個包含了被調用的方法名稱,而第二個參數包含了傳遞給該方法的參數數組?梢酝ㄟ^這個方法實現類似于函數重載的功能?聪旅娴拇a。

  public function __call($method,$p)

  {

  if($method=="display"){

  if(is_object($p[0])){

  $this->displayObject($p[0]);

  }else if(is_array($p[0])){

  $this->displayArray($p[0]);

  }else{

  $this->displayScalar($p[0]);

  }

  }

  }

  //下面是對上面定義的調用

  $ov=new overload;

  $ov->display(array(1,2,3));

  $ov->display('cat');

  定義方法的時候,可以看到有三個分支,如果一個對象傳遞給display()方法,就調用的是displayObject()方法;如果傳遞的是一個數組,調用displayArray();傳遞的是其他的內容的話,則調用的是displayScalar()方法。。。可以看到下面調用時,第一個是傳遞了一個數組,則調用displayArray()。第二個傳入的不是對象也不是數組,則屬于其他內容,調用的是displayScalar()方法。所以這樣子就用__call()方法實現了類似于其他語言的方法重載。

  方法覆蓋(override)

  所謂覆蓋,從本質上來說就是重寫。就是當子類繼承父類的一些方法后,子類又在其內部定義了相同的方法,則這個新定義的方法會覆蓋繼承而來的父類的方法,子類只能調用其內部定義的方法。

  有以下幾點要求:

  1.當一個父類和子類有一個方法,參數和名字完全一致,那么子類方法會覆蓋父類的方法。

  2.在實行方法覆蓋的時候,訪問修飾符可以是不一樣的,但是子類的訪問范圍必須大于等于父類的訪問范圍。

  3.要求參數和名字一樣。并不是要求子類,父類名稱相同。

  下面是對這幾點的解釋:

  第一點,必須參數一致,才會實現方法覆蓋。當參數個數不一致,則會報錯(這就牽扯到上面說所得方法重載)。當方法名字不一致,就不會覆蓋,只是子類新定義的方法。;

  第二點,這是php這些語言設計時的規定吧。我是這么理解的是訪問高一層的東西比較容易,如果再去訪問底層的東西權限肯定要高一些。

  看代碼:

  class people{

  protected function sing(){

  echo "人唱歌";

  }

  }

  class woman extends people{

  public function sing(){

  echo "女人唱歌";

  }

  }

  $woman1=new woman();

  $woman1->sing();

  這樣很正常的可以輸出“女人唱歌”。但當把woman里的sing()方法改為proctcted,父元素改成public()時,即將父類的訪問權限設置的大于子類后,就會報下面的錯誤。

  第三點,是要求參數和名字一樣,具體就是要求參數的個數與父類相同,而并不是參數名稱一致。即傳遞的參數名字可以為任意,只要保證傳遞的個數相同即可。

  以上內容簡單介紹了PHP語言中多態的兩個實現。

  PS:重寫、覆蓋、重載、多態幾個概念的區別分析

  override->重寫(=覆蓋)、overload->重載、polymorphism -> 多態

  override是重寫(覆蓋)了一個方法,以實現不同的功能。一般是用于子類在繼承父類時,重寫(重新實現)父類中的方法。

  重寫(覆蓋)的規則:

  1、重寫方法的參數列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是重載.

  2、重寫方法的訪問修飾符一定要大于被重寫方法的訪問修飾符(public>protected>default>private)。

  3、重寫的方法的返回值必須和被重寫的方法的返回一致;

  4、重寫的方法所拋出的異常必須和被重寫方法的所拋出的異常一致,或者是其子類;

  5、被重寫的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行重寫。

  6、靜態方法不能被重寫為非靜態的方法(會編譯出錯)。

  overload是重載,一般是用于在一個類內實現若干重載的方法,這些方法的名稱相同而參數形式不同。

  重載的規則:

  1、在使用重載時只能通過相同的方法名、不同的參數形式實現。不同的參數類型可以是不同的參數類型,不同的參數個數,不同的參數順序(參數類型必須不一樣);

  2、不能通過訪問權限、返回類型、拋出的異常進行重載;

  3、方法的異常類型和數目不會對重載造成影響;

  多態的概念比較復雜,有多種意義的多態,一個有趣但不嚴謹的說法是:繼承是子類使用父類的方法,而多態則是父類使用子類的方法。

  一般,我們使用多態是為了避免在父類里大量重載引起代碼臃腫且難于維護。

  舉個例子:

  public class Shape

  {

  public static void main(String[] args){

  Triangle tri = new Triangle();

  System.out.println("Triangle is a type of shape? " + tri.isShape());// 繼承

  Shape shape = new Triangle();

  System.out.println("My shape has " + shape.getSides() + " sides."); // 多態

  Rectangle Rec = new Rectangle();

  Shape shape2 = Rec;

  System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); //重載

  }

  public boolean isShape(){

  return true;

  }

  public int getSides(){

  return 0 ;

  }

  public int getSides(Triangle tri){ //重載

  return 3 ;

  }

  public int getSides(Rectangle rec){ //重載

  return 4 ;

  }

  }

  class Triangle extends Shape

  {

  public int getSides() { //重寫,實現多態

  return 3;

  }

  }

  class Rectangle extends Shape

  {

  public int getSides(int i) { //重載

  return i;

  }

  }

【PHP面向對象編程之深入理解方法】相關文章:

PHP面向對象的魔術方法詳解10-30

PHP語言:面向對象09-24

PHP面向對象的進階學習09-06

PHP語言面向對象的內容06-22

php語言中的面向對象07-28

php面向對象的程序設計10-12

如何理解Java面向對象07-06

PHP面向對象三大特點學習06-14

深入理解PHP的.htaccess文件08-11

主站蜘蛛池模板: 明溪县| 大理市| 防城港市| 桑日县| 芜湖县| 龙岩市| 青龙| 南京市| 新兴县| 宜川县| 天津市| 哈尔滨市| 贵港市| 嘉鱼县| 牟定县| 酒泉市| 大化| 涡阳县| 西平县| 五莲县| 从化市| 铜梁县| 璧山县| 吉水县| 兴国县| 浦东新区| 察哈| 昭平县| 龙游县| 盘锦市| 故城县| 灵台县| 喜德县| 诸城市| 靖州| 时尚| 江口县| 黄山市| 阳原县| 西吉县| 徐闻县|