首頁  >  文章  >  後端開發  >  PHP物件導向精華

PHP物件導向精華

WBOY
WBOY原創
2016-08-08 09:32:20825瀏覽

1 使用extends實現繼承以及重載、魔術方法的含義

class B extends A

聲明的時候B裡可以沒有A裡的方法

調用的時候$b=new B();

$b ->A裡的方法();

$b->A裡的屬性=1;

$b->B裡的方法();

$b->B裡的方法();

如果$a=new A();

可以

$a->A裡的方法();

$a->A裡的屬性=1;

不可以

$a->B裡的方法();

$a->B裡的方法();

重載:B繼承A ,B裡實作和A同名的方法屬性。

PHP中的"重載"與其它絕大多數物件導向語言不同。傳統的"重載"是用於提供多個同名的 類別方法,但各方法的參數類型和個數不同。

魔術方法:PHP把所有以__(兩個底線)開頭的類方法當成魔術方法。所以當你定義自己的類別方法時,不要以 __為前綴。

2 繼承用private和protected存取修飾符可見性

屬性方法private不可以被繼承

屬性方法protected類別外部不可見,可以被繼承

 屬性方法public 所定義的類別成員可以在任何地方被類別成員可以在任何地方被被定義訪問

3 php中雙冒號::的應用

php類代碼中常看到"::"的操作符,這個是作用域限定操作符,是用一個雙冒號"::"表示,它用來置頂類別中不同作用域的層級。左邊是作用域右邊是訪問作用域的成員。

在php中定義的作用域有self和parent兩種(在php6中提供了static作用域)。

範圍解析操作符(也可稱為Paamayim Nekudotayim)或更簡單地說是一對冒號,可以用於訪問靜態成員方法和常數,還可以用於子類覆蓋父類中的成員和方法

class MyClass {
    const 
CONST_VALUE Y MyClass::
CONST_VALUE
; class OtherClass 
extends 

MyClass{    public static $my_static ;    public static function 
doubleColon
() {
        echo parent ::CONST_VALUE 
"n";
       . 
"n";    }}OtherClass ::
doubleColon
();//子類覆蓋父類class 5ClasstecClass


class 
myFunc() {        echo " MyClass::myFunc()n";
    }
}

class 

OtherClass 

extends 方法    
public function 
myFunc
()    {        
// 但仍可呼叫已被涵蓋的方法
             echo "OtherClass::myFunc()n"

;
    }
}$class = new 
OtherClass
();
my
OtherClass
();)

4 php中this和self以及parent的作用
this:就是指向目前物件實例的指針,不指向任何其他物件或類別。
self:表示目前類別的作用域,與this不同的是它不表示類別的某個特定實例,在類別之外的程式碼中不能使用self,而且它無法辨識自己在繼承中層次的位置。也就是說,當在擴展類別中使用self時,它呼叫的不是父類別的方法,而是擴展類別的重載的方法。 self是指向類別本身,也就是self是不指向任何已經實例化的對象,一般self使用來指向類別中的靜態變數。

private static $firstCount = 0;
        private $lastCount;
        //建構子                $this->lastCount = ++self:$firstCount; //使用self來呼叫靜態變數,使用self呼叫必須使用::(域運算符號)
        }


parent:表示目前類別父類別的作用域,其餘的跟self特性相同。 parent是指向父類別的指針,
一般我們都使用parent來呼叫父類別的建構子。

//繼承類別的建構子     function __construct( $personSex, $personAge )

   {

         $this->personSex = $personSex;
          $this->personAge = $personAge;
   }


5 構造函數與析構函數
物件之前做一些初始化工作。

function 

__construct

() {}

如果子類別中定義了建構子則不會暗中呼叫其父類別的建構子。要執行父類別的建構函數,需要在子類別的建構子中呼叫 parent::__construct()
PHP 5 引入了析構函數的概念,這類似於其它面向對象的語言,如 C++。析構函數會在到某個物件的所有參考都被刪除或當物件被明確銷毀時執行。

function __destruct() {}

 6 final 關鍵字
PHP 5 新增了 final 關鍵字。如果父類別中的方法被宣告為final,則子類別無法覆寫該方法; 如果一個類別被宣告為final,則不能被繼承。

7有構造函數

子構造

8 接口

可以透過interface來定義一個接口,就像定義一個標準的類別一樣。

注意:

1)但其中定義所有的方法都是空的;

2)介面中定義的所有方法都必須是public,這是介面的特性;

3)實作多個介面時,介面中的方法不能有重名

4)介面也可以繼承,透過使用extends操作符;

5)介面中也可以定義常數。介面常數和類別常數的使用完全相同。 它們都是定值,不能被子類別或子介面修改。

// 宣告一個'iTemplate'介面
interface iTemplate
{
   
$var);    public function );    public function  getHtml(
$template);}
// 實作介面
///容

{    private $vars
= array();
  
    public function setVariable($name
>
vars[$name
] = 
$var;    }       public function getHtml(
$template
)    {  name => $value) {            $template 
str_replace
(
'{' $name '}'

$value$template);  $template;    }}
9 屬性類的變數成員叫做“屬性”,屬性聲明是由關鍵字publicprotectedprivate開頭,然後跟一個變數組成。 屬性中的變數可以初始化,但是初始化的值必須是常數,這裡的常數是指php腳本在編譯階段時就為常數,而不是在編譯階段之後在執行階段運算出的常數。


在PHP5 中,預先定義了兩個函數「__get()」和「__set()」來獲 取和賦值其屬性,以及檢查屬性的「__isset()」和刪除屬性的方法「__unset( )」。
簡單的說一個是取值,一個是賦值。 ,「__set()」和「__get()」這兩個方法,這兩個方法不是預設存在的,而是我們手工添加到類別裡面去的,像構造方法(__construct())一樣, 類別裡面添加了才會存在,可以用下面的方式來添加這兩個方法,當然也可以按個人的風格來添加://__get()方法用來獲取私有屬性

view plaincopy to clipboard

  1. class Person{   
  2. ate
  3.  $name
  4. //人的名字   private $sex
  5. /人的性別  $age//人的年齡 
  6. //__get()方法用來取得私人屬性  
  7.   private 🎎 {   if
  8. (isset(
  9. $this->
  10. $property_name
  11. )){   return( else {   
  12. return(NULL);   }   } 屬性  
  13.   
  14. private function  __set($property_name$value
  15. ){   
  16. _$value $value
  17. ;   
  18. }   
  19. //__isset()方法    
  20. private 
  21. function__ echo "isset()函數測定私有成員時,自動呼叫
    "
    ;   return isset(
  22. $this
  23.  //__unset()方法  private
  24.  
  25. function
  26.  __unset(
  27. "當在類別外部使用unset()函數來刪除私有成員時自動調用的
    ";   
  28. unset($this->$ }   
  29. $p1
  30. = new Person();   
  31. $p1
  32. ->name="this is a person name"(私有成員時,自動呼叫__isset()方法幫我們完成,回傳結果為true   echo var_dump(isset(
  33. $p1
  34. ->name).
  35. echo $p1
  36. ->name."
    ";   "
    ";   幫我們完成,刪除name私有屬性   
  37. unset($p1->name);   🠎
  38. echo $p1->name;   
  39. ?>   
  40. ]
  41. ?>   
  42. ] plaincopy
    1. class Person{ //下面是人的成員屬性 private $name; //人的名字/$private 年齡 //__get()方法用來取得私人屬性 private function __get($property_name){ if(isset($this->$property_name)){ return($this->$property_name);}else🜎 (NULL); } } } //__set()方法用來設定私人屬性 private function __set($property_name,$value) /__isset()方法 private function __isset($nm){ echo "isset()函數測定私人成員時,自動呼叫
      "; return isset($this->$nm); } //__unset()方法 isset($this->$nm); } //__unset()方法 private function
    2.    __unset($nm){ echo
    3. ($this->$nm); } } $p1= "this is a person name"//在使用isset()函數測定私有成員時,自動呼叫__isset()方法幫我們完成,回傳結果為true echo var_dump(isset($p1->name)). "
      "; echo $p1->name."
      "; //使用unset()函數刪除私有成員時,自動呼叫__unset()方法幫我們完成,移除name私有屬性
          unset($p1->name); //已刪除了, 所這行不會有輸出 echo  10 複製物件複製可以透過clone關鍵字來完成(如果物件中存在__clone()方法,會先被呼叫)。物件中的 __clone()方法不能直接呼叫。 當物件被複製後,PHP5會對物件的所有屬性執行一個「淺複製」(shallow copy)。所有的屬性中的引用 仍然不變,指向原來的變數。如果定義了__clone()方法,則新建立的物件(複製產生的物件)中的__clone()方法會被調用, 可用於修改屬性的值(如果有必要的話)。 11 php的引用
    4. 就是在變數或函數、物件等前面加上&符號

    5. 在PHP 中引用的意思是:不同的名字存取同一個變數內容.
      與C語言中的指標是有差別的. C語言中的指標裡面儲存的是變數的內容在記憶體中存放的位址
      變數的引用
      PHP 的引用允許你用兩個變數來指向同一個內容
      [php]
      $a="ABC";
      $b =&$a;
      echo $a;//這裡輸出:ABC

      echo $a;//這裡輸出:ABC:
      $b="EFG";
      echo $a;//這裡$a的值變成EFG 所以輸出EFG
      echo $b;//這裡輸出EFG

      echo $b;//這裡輸出EFG [/php]
      函數的傳址呼叫
      傳址呼叫我就不多說了下面直接給出程式碼
      [php]
      function test($a)[php]
      function test($a)
      $a=$a+100;
      }
      $b=1;
      echo $b;//輸出1
      echo $b;//輸出1的其實是$b的變數內容所處的記憶體位址,透過在函數裡改變$a的值就可以改變$b的值了
      echo "
      ";
      echo $b;//輸出101
      [/php]
      要注意的是,在這裡test(1);的話就會出錯,原因自己去想
      函數的引用返回
      php]
      function &test()
      {
      static $b=0;//申明一個靜態變數
      $b=$b+1; $b;
      }
      $a=test();//這條語句會輸出$b的值為1
      $a=5;
      $a=test($a=5;
      $a=test();這語句會輸出$b的值為2
      $a=&test();//這條語句會輸出$b的值為3
      $a=5;
      $a=test( );//這條語句會輸出$b的值為6
      [/php]
      下面解釋下: 
      透過這種方式$a=test();得到的其實不是函數的引用返回,這跟普通的函數呼叫沒有區別至於原因: 這是PHP的規定
      PHP規定透過$a=&test(); 方式得到的才是函數的引用返回
      於什麼是返回到PHP手冊上說:引用返回用在當想用函數找到引用應該被綁定在哪一個變數上面時。 $a=test()方式調用函數,只是將函數的值賦給$a而已, 而$a做任何改變都不會影響到函數中的$b
      而通過$a=&test()方式調用函數呢, 他的作用是將return $b中的$b變數的記憶體位址與$a變數的記憶體位址指向了同一個地方
      即產生了相當於這樣的效果($a=&b;) 所以改變$a的值也同時改變了$b的值所以在執行了
      $a=&test();
      $a=5;
      以後,$b的值變為了5
      這裡是為了讓大家理解函數的引用返回才使用靜態變數的,其實函數的引用回傳多用在物件中
      物件的引用
      [php]

      [php]

      [php]
      [php]

      var $abc="ABC";
      }
      $b=new a;
      $c=$b;
      echob->abc$c=$b; $c->abc;//這裡輸出ABC
      $b->abc="DEF";
      echo $c->abc;//這裡輸出DEF
      ? ]
      以上程式碼是在PHP5中的運行效果
      在PHP5中物件的複製是透過引用來實現的。上列$b=new a; $c=$b; 其實等效於$b=new a; $c=&$b;
      PHP5中預設就是透過引用來呼叫對象, 但有時你可能會想建立一個物件的副本,並希望原來的物件的改變不影響到副本. 為了這樣的目的,PHP定義了一個特殊的方法,稱為__clone.
      引用的作用
      如果程式比較大,引用同一個物件的變數比較多,並且希望用完該物件後手工清除它,個人建議用"&" 方式,然後用$var=null的方式清除. 其它時候還是用php5的預設方式吧. 另外, php5中對於大數組的傳遞,建議用"&" 方式, 畢竟節省內存空間使用。
      取消引用
      當你 unset 一個引用,只是斷開了變數名稱和變數內容之間的綁定。這並不意味著變數內容被銷毀了。例如: 


$a = 1;
$b =& $a;
unset ($a); ,只是$a。  

global 引用當用 global $var 宣告一個變數時實際上建立了一個到全域變數的引用。也就是說和這樣做是相同的: 

$var =& $GLOBALS["var"];

?> 不會unset 全域變數。  

$this
在一個物件的方法中,$this 永遠是呼叫它的物件的引用。 //下面再來個小插曲
php中對於地址的指向(類似指針)功能不是由用戶自己來實現的,是由Zend核心實現的,php中引用採用的是“寫時拷貝”的原理,就是除非發生寫入操作,指向同一個位址的變數或物件是不會被拷貝的。
通俗的講
1:如果有下面的程式碼
[php] 

$a="ABC";
其實此時$a與$b都是指向同一記憶體位址而並不是$a與$b佔用不同的記憶體2:如果在上面的程式碼基礎上再加如下程式碼
[ php] 

$a="EFG";
[/php]
由於$a與$b所指向的記憶體的資料要重新寫入核心會自動判斷為$b生產一個$a的資料拷貝,重新申請一塊記憶體進行儲存 以上就介紹了PHP物件導向精華,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn