日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
PHP新手之學習類與對象

PHP5 引入了新的對象模型(Object Model)。完全重寫了 PHP 處理對象的方式,允許更佳性能和更多特性。

創(chuàng)新互聯(lián)建站專注于潛山網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供潛山營銷型網(wǎng)站建設,潛山網(wǎng)站制作、潛山網(wǎng)頁設計、潛山網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務,打造潛山網(wǎng)絡公司原創(chuàng)品牌,更為您提供潛山網(wǎng)站排名全網(wǎng)營銷落地服務。

一、基本概念

1、class

每個類的定義都以關鍵字 class 開頭,后面跟著類名,可以是任何非 PHP 保留字的名字。后面跟著一對花括號,里面包含有類成員和方法的定義。偽變量 $this 可以在當一個方法在對象內(nèi)部調(diào)用時使用。$this 是一個到調(diào)用對象(通常是方法所屬于的對象,但也可以是另一個對象,如果該方法是從第二個對象內(nèi)靜態(tài)調(diào)用的話)的引用。看下面例子:

Example#1 面向?qū)ο笳Z言中的 $this 變量

 
 
 
  1. class A
  2. {
  3. function foo()
  4. {
  5. if (isset($this)) {
  6. echo '$this is defined (';
  7. echo get_class($this);
  8. echo ")\n";
  9. } else {
  10. echo "\$this is not defined.\n";
  11. }
  12. }
  13. }
  14. class B
  15. {
  16. function bar()
  17. {
  18. A::foo();
  19. }
  20. }
  21. $a = new A();
  22. $a->foo();
  23. A::foo();
  24. $b = new B();
  25. $b->bar();
  26. B::bar();
  27. ?>

上例將輸出:

 
 
 
  1. $this is defined (a)
  2. $this is not defined.
  3. $this is defined (b)
  4. $this is not defined.

Example#2 簡單的類定義

 
 
 
  1. class SimpleClass
  2. {
  3. // 成員聲明
  4. public $var = 'a default value';
  5. // 方法聲明
  6. public function displayVar() {
  7. echo $this->var;
  8. }
  9. }
  10. ?>

Example#3 類成員的默認值

 
 
 
  1. class SimpleClass
  2. {
  3. // 無效的類成員定義:
  4. public $var1 = 'hello '.'world';
  5. public $var2 = <<
  6. hello world
  7. EOD;
  8. public $var3 = 1+2;
  9. public $var4 = self::myStaticMethod();
  10. public $var5 = $myVar;
  11. // 正確的類成員定義:
  12. public $var6 = myConstant;
  13. public $var7 = self::classConstant;
  14. public $var8 = array(true, false);
  15. }
  16. ?>

2、new

要創(chuàng)建一個對象的實例,必須創(chuàng)建一個新對象并將其賦給一個變量。當創(chuàng)建新對象時該對象總是被賦值,除非該對象定義了構(gòu)造函數(shù)并且在出錯時拋出了一個異常。

Example#4 創(chuàng)建一個實例

 
 
 
  1. $instance = new SimpleClass();
  2. ?>

復制代碼當把一個對象已經(jīng)創(chuàng)建的實例賦給一個新變量時,新變量會訪問同一個實例,就和用該對象賦值一樣。此行為和給函數(shù)傳遞入實例時一樣??梢杂每寺〗o一個已創(chuàng)建的對象建立一個新實例。

Example#5 對象賦值

 
 
 
  1. $assigned   =  $instance;
  2. $reference  =& $instance;
  3. $instance->var = '$assigned will have this value';
  4. $instance = null; // $instance and $reference become null
  5. var_dump($instance);
  6. var_dump($reference);
  7. var_dump($assigned);
  8. ?>

復制代碼上例將輸出:

 
 
 
  1. NULL
  2. NULL
  3. object(SimpleClass)#1 (1) {
  4. ["var"]=>
  5. string(30) "$assigned will have this value"
  6. }

3、extends

一個類可以在聲明中用 extends 關鍵字繼承另一個類的方法和成員。不能擴展多個類,只能繼承一個基類。

被繼承的方法和成員可以通過用同樣的名字重新聲明被覆蓋,除非父類定義方法時使用了 final 關鍵字。可以通過 parent:: 來訪問被覆蓋的方法或成員。

Example#6 簡單的類繼承

 
 
 
  1. class ExtendClass extends SimpleClass
  2. {
  3. // Redefine the parent method
  4. function displayVar()
  5. {
  6. echo "Extending class\n";
  7. parent::displayVar();
  8. }
  9. }
  10. $extended = new ExtendClass();
  11. $extended->displayVar();
  12. ?>

上例將輸出:

 
 
 
  1. Extending class
  2. a default value

#p#

二、自動加載對象

很多開發(fā)者寫面向?qū)ο蟮膽贸绦驎r對每個類的定義建立一個 PHP 源文件。一個很大的煩惱是不得不在每個腳本(每個類一個文件)開頭寫一個長長的包含文件列表。

在 PHP 5 中,不再需要這樣了??梢远x一個 __autoload 函數(shù),它會在試圖使用尚未被定義的類時自動調(diào)用。通過調(diào)用此函數(shù),腳本引擎在 PHP 出錯失敗前有了最后一個機會加載所需的類。

Note: 在 __autoload 函數(shù)中拋出的異常不能被 catch 語句塊捕獲并導致致命錯誤。如果使用 PHP 的 CLI 交互模式 時,Autoloading 不存在。

Example#1 Autoload 例子(本例嘗試分別從 MyClass1.php 和 MyClass2.php 文件中加載 MyClass1 和 MyClass2 類。)

 
 
 
  1. function __autoload($class_name) {
  2. require_once $class_name . '.php';
  3. }
  4. $obj = new MyClass1();
  5. $obj2 = new MyClass2();
  6. ?>

三、構(gòu)造函數(shù)和析構(gòu)函數(shù)

1、構(gòu)造函數(shù)

 
 
 
  1. void __construct ([ mixed $args [, $... ]] )

PHP 5 允行開發(fā)者在一個類中定義一個方法作為構(gòu)造函數(shù)。具有構(gòu)造函數(shù)的類會在每次創(chuàng)建對象時先調(diào)用此方法,所以非常適合在使用對象之前做一些初始化工作。

Note: 如果子類中定義了構(gòu)造函數(shù)則不會暗中調(diào)用其父類的構(gòu)造函數(shù)。要執(zhí)行父類的構(gòu)造函數(shù),需要在子類的構(gòu)造函數(shù)中調(diào)用 parent::__construct()。

Example#1 使用新標準的構(gòu)造函數(shù)

 
 
 
  1. class BaseClass {
  2. function __construct() {
  3. print "In BaseClass constructor\n";
  4. }
  5. }
  6. class SubClass extends BaseClass {
  7. function __construct() {
  8. parent::__construct();
  9. print "In SubClass constructor\n";
  10. }
  11. }
  12. $obj = new BaseClass();
  13. $obj = new SubClass();
  14. ?>

復制代碼為了實現(xiàn)向后兼容性,如果 PHP 5 在類中找不到 __construct() 函數(shù),它就會嘗試尋找舊式的構(gòu)造函數(shù),也就是和類同名的函數(shù)。因此唯一會產(chǎn)生兼容性問題的情況是:類中已有一個名為 __construct() 的方法,但它卻又不是構(gòu)造函數(shù)。

2、析構(gòu)函數(shù)

 
 
 
  1. void __destruct ( void )

PHP 5 引入了析構(gòu)函數(shù)的概念,這類似于其它面向?qū)ο蟮恼Z言,如 C++。析構(gòu)函數(shù)會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執(zhí)行。

Example#2 析構(gòu)函數(shù)示例

 
 
 
  1. class MyDestructableClass {
  2. function __construct() {
  3. print "In constructor\n";
  4. $this->name = "MyDestructableClass";
  5. }
  6. function __destruct() {
  7. print "Destroying " . $this->name . "\n";
  8. }
  9. }
  10. $obj = new MyDestructableClass();
  11. ?>

復制代碼和構(gòu)造函數(shù)一樣,父類的析構(gòu)函數(shù)不會被引擎暗中調(diào)用。要執(zhí)行父類的析構(gòu)函數(shù),必須在子類的析構(gòu)函數(shù)體中顯式調(diào)用 parent::__destruct()。

Note: 析構(gòu)函數(shù)在腳本關閉時調(diào)用,此時所有的頭信息已經(jīng)發(fā)出。試圖在析構(gòu)函數(shù)中拋出一個異常會導致致命錯誤。

#p#

四、訪問控制

對屬性或方法的訪問控制,是通過在前面添加關鍵字 public、protected 或 private 來實現(xiàn)的。由 public 所定義的類成員可以在任何地方被訪問;由 protected 所定義的類成員則可以被其所在類的子類和父類訪問(當然,該成員所在的類也可以訪問);而由 private 定義的類成員則只能被其所在類訪問。

1、對類成員的訪問控制

類成員都必須使用關鍵字public、protected 或 private 進行定義

Example#1 聲明類成員

 
 
 
  1. /**
  2. * Define MyClass
  3. */
  4. class MyClass
  5. {
  6.     public $public = 'Public';
  7.     protected $protected = 'Protected';
  8.     private $private = 'Private';
  9.     function printHello()
  10.     {
  11.         echo $this->public;
  12.         echo $this->protected;
  13.         echo $this->private;
  14.     }
  15. }
  16. $obj = new MyClass();
  17. echo $obj->public; // 這行能被正常執(zhí)行
  18. echo $obj->protected; // 這行會產(chǎn)生一個致命錯誤
  19. echo $obj->private; // 這行也會產(chǎn)生一個致命錯誤
  20. $obj->printHello(); // 輸出 Public、Protected 和 Private
  21. /**
  22. * Define MyClass2
  23. */
  24. class MyClass2 extends MyClass
  25. {
  26.     // 可以對 public 和 protected 進行重定義,但 private 而不能
  27.     protected $protected = 'Protected2';
  28.     function printHello()
  29.     {
  30.         echo $this->public;
  31.         echo $this->protected;
  32.         echo $this->private;
  33.     }
  34. }
  35. $obj2 = new MyClass2();
  36. echo $obj->public; // 這行能被正常執(zhí)行
  37. echo $obj2->private; // 未定義 private
  38. echo $obj2->protected; // 這行會產(chǎn)生一個致命錯誤
  39. $obj2->printHello(); // 輸出 Public、Protected2,但不會輸出 Private
  40. class Bar 
  41. {
  42.     public function test() {
  43.         $this->testPrivate();
  44.         $this->testPublic();
  45.     }
  46.     public function testPublic() {
  47.         echo "Bar::testPublic\n";
  48.     }
  49.     
  50.     private function testPrivate() {
  51.         echo "Bar::testPrivate\n";
  52.     }
  53. }
  54. class Foo extends Bar 
  55. {
  56.     public function testPublic() {
  57.         echo "Foo::testPublic\n";
  58.     }
  59.     
  60.     private function testPrivate() {
  61.         echo "Foo::testPrivate\n";
  62.     }
  63. }
  64. $myFoo = new foo();
  65. $myFoo->test(); // Bar::testPrivate 
  66.                 // Foo::testPublic
  67. ?>

Note: 為了兼容性考慮,在 PHP 4 中使用 var 關鍵字對變量進行定義的方法在 PHP 5 中仍然有效(只是作為 public 關鍵字的一個別名)。在 PHP 5.1.3 之前的版本,該語法會產(chǎn)生一個 E_STRICT 警告。

2、對方法的訪問控制

類中的方法都必須使用關鍵字public、protected 或 private 進行定義。如果沒有設置這些關鍵字,則該方法會被設置成默認的 public。

Example#2 聲明類中的方法

 
 
 
  1. /**
  2. * Define MyClass
  3. */
  4. class MyClass
  5. {
  6.     // 構(gòu)造函數(shù)必須是 public
  7.     public function __construct() { }
  8.     // 聲明一個 public 的方法
  9.     public function MyPublic() { }
  10.     // 聲明一個 protected 的方法
  11.     protected function MyProtected() { }
  12.     // 聲明一個 private 的方法
  13.     private function MyPrivate() { }
  14.     // 這個方法也是 public 的
  15.     function Foo()
  16.     {
  17.         $this->MyPublic();
  18.         $this->MyProtected();
  19.         $this->MyPrivate();
  20.     }
  21. }
  22. $myclass = new MyClass;
  23. $myclass->MyPublic(); // 這行能被正常執(zhí)行
  24. $myclass->MyProtected(); // 這行會產(chǎn)生一個致命錯誤
  25. $myclass->MyPrivate(); // 這行會產(chǎn)生一個致命錯誤
  26. $myclass->Foo(); // Public、Protected 和 Private 都被調(diào)用了
  27. /**
  28. * Define MyClass2
  29. */
  30. class MyClass2 extends MyClass
  31. {
  32.     // This is public
  33.     function Foo2()
  34.     {
  35.         $this->MyPublic();
  36.         $this->MyProtected();
  37.         $this->MyPrivate(); // 這行會產(chǎn)生一個致命錯誤
  38.     }
  39. }
  40. $myclass2 = new MyClass2;
  41. $myclass2->MyPublic(); // 這行能被正常執(zhí)行
  42. $myclass2->Foo2(); // Public 和 Protected 都被調(diào)用了,但 Private 不會被調(diào)用
  43. ?>

#p#

五、范圍解析操作符(::)

范圍解析操作符(也可稱作 Paamayim Nekudotayim)或者更簡單地說是一對冒號,可以用于訪問靜態(tài)成員、方法和常量,還可以用于覆蓋類中的成員和方法。

當在類的外部訪問這些靜態(tài)成員、方法和常量時,必須使用類的名字。

把 Paamayim Nekudotayim 選作該操作符的名字似乎有些奇怪。然而,這是 Zend 開發(fā)小組在寫 Zend Engine 0.5 (被用于 PHP 3 中)時所作出的決定。事實上這個詞在希伯萊文就是雙冒號的意思。

Example#1 在類的外部使用 :: 操作符

 
 
 
  1. class MyClass {
  2. const CONST_VALUE = 'A constant value';
  3. }
  4. echo MyClass::CONST_VALUE;
  5. ?>

self 和 parent 這兩個特殊的關鍵字是用于在類的內(nèi)部對成員或方法進行訪問的。

Example#2 :: from inside the class definition

 
 
 
  1. class OtherClass extends MyClass
  2. {
  3. public static $my_static = 'static var';
  4. public static function doubleColon() {
  5. echo parent::CONST_VALUE . "\n";
  6. echo self::$my_static . "\n";
  7. }
  8. }
  9. OtherClass::doubleColon();
  10. ?>

當一個子類覆蓋其父類中的方法時,PHP 不會再執(zhí)行父類中已被覆蓋的方法,直到子類中調(diào)用這些方法為止。這種機制也作用于 構(gòu)造函數(shù)和析構(gòu)函數(shù)、重載 及 魔術 函數(shù)。

Example#3 調(diào)用父類的方法

 
 
 
  1. class MyClass
  2. {
  3.     protected function myFunc() {
  4.         echo "MyClass::myFunc()\n";
  5.     }
  6. }
  7. class OtherClass extends MyClass
  8. {
  9.     // 覆蓋父類中的方法
  10.     public function myFunc()
  11.     {
  12.         // 但仍然可以調(diào)用已被覆蓋的方法
  13.         parent::myFunc();
  14.         echo "OtherClass::myFunc()\n";
  15.     }
  16. }
  17. $class = new OtherClass();
  18. $class->myFunc();
  19. ?>

希望通過以上內(nèi)容的介紹,能夠給你帶來幫助。


分享標題:PHP新手之學習類與對象
網(wǎng)頁地址:http://www.5511xx.com/article/cdhdeis.html