成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PHP新手之學習類與對象

開發 后端
本文介紹的是PHP程序設計語言中類和對象的基本知識,適合初學者閱讀,希望對你有幫助,一起來看。

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

一、基本概念

1、class

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

Example#1 面向對象語言中的 $this 變量

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

上例將輸出:

 

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

 

Example#2 簡單的類定義

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

Example#3 類成員的默認值

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

2、new

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

Example#4 創建一個實例

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

復制代碼當把一個對象已經創建的實例賦給一個新變量時,新變量會訪問同一個實例,就和用該對象賦值一樣。此行為和給函數傳遞入實例時一樣。可以用克隆給一個已創建的對象建立一個新實例。

Example#5 對象賦值

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

復制代碼上例將輸出:

 

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

 

3、extends

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

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

Example#6 簡單的類繼承

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

上例將輸出:

 

  1. Extending class  
  2. a default value 

 

#p#

二、自動加載對象

很多開發者寫面向對象的應用程序時對每個類的定義建立一個 PHP 源文件。一個很大的煩惱是不得不在每個腳本(每個類一個文件)開頭寫一個長長的包含文件列表。

在 PHP 5 中,不再需要這樣了。可以定義一個 __autoload 函數,它會在試圖使用尚未被定義的類時自動調用。通過調用此函數,腳本引擎在 PHP 出錯失敗前有了最后一個機會加載所需的類。

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

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

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

 

三、構造函數和析構函數

1、構造函數

 

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

 

PHP 5 允行開發者在一個類中定義一個方法作為構造函數。具有構造函數的類會在每次創建對象時先調用此方法,所以非常適合在使用對象之前做一些初始化工作。

Note: 如果子類中定義了構造函數則不會暗中調用其父類的構造函數。要執行父類的構造函數,需要在子類的構造函數中調用 parent::__construct()。

Example#1 使用新標準的構造函數

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

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

2、析構函數

 

  1. void __destruct ( void ) 

 

PHP 5 引入了析構函數的概念,這類似于其它面向對象的語言,如 C++。析構函數會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行。

Example#2 析構函數示例

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

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

Note: 析構函數在腳本關閉時調用,此時所有的頭信息已經發出。試圖在析構函數中拋出一個異常會導致致命錯誤。

#p#

四、訪問控制

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

1、對類成員的訪問控制

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

Example#1 聲明類成員

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

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

2、對方法的訪問控制

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

Example#2 聲明類中的方法

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

#p#

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

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

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

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

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

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

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

Example#2 :: from inside the class definition

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

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

Example#3 調用父類的方法

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

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

【編輯推薦】

  1. PHP新手之學習數組聲明
  2. 介紹使用PHP框架的十大理由
  3. PHP新手之如何學習PHP的講解
  4. PHP框架之如何學習新的PHP框架
  5. 詳細介紹使用PHP框架的原因
責任編輯:于鐵 來源: 互聯網
相關推薦

2011-07-05 18:10:14

PHP

2011-07-07 16:41:04

PHP

2011-06-15 15:55:36

PHP

2011-07-05 17:52:41

PHP

2011-06-15 15:36:19

PHP變量常量

2011-07-11 17:56:04

java

2015-03-20 13:20:11

PHP框架全方面了解PHP

2011-07-04 14:33:07

PHP

2011-07-04 14:57:56

PHP

2011-08-05 14:48:06

iPhone應用 異步隊列

2011-06-15 16:58:26

PHP

2011-07-12 17:06:43

PHP

2011-07-11 09:29:32

PHP面向對象編程

2009-11-16 08:58:43

PHP語言

2011-07-20 10:30:29

C語言

2011-06-16 11:04:07

Qt

2011-06-14 15:28:44

QT

2024-04-02 11:34:09

成員對象封閉類C++

2021-10-25 09:53:52

鴻蒙HarmonyOS應用

2009-09-07 09:03:05

思科認證CCNA學習的重要性
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97在线观视频免费观看 | 亚洲精品乱码久久久久久按摩观 | 欧美一区二区在线视频 | 精品成人佐山爱一区二区 | 精品欧美一区二区三区久久久 | 一区二区三区四区免费视频 | 中文字幕日韩欧美一区二区三区 | 国产高清免费 | 一级做a爰片久久毛片 | 精品一二三区在线观看 | 看亚洲a级一级毛片 | 亚洲三区在线观看 | 日韩精品一区在线 | 国产a区| 中文字幕在线看 | 色就是色欧美 | 一级黄色录像毛片 | 美女国内精品自产拍在线播放 | 精品免费国产一区二区三区四区介绍 | 欧美日韩在线免费观看 | 三级视频久久 | www.v888av.com| 99精品久久久 | 国产视频1区 | 99这里只有精品 | 精品综合久久久 | 久久高清 | 在线看片网站 | 一区二区三区国产好 | 午夜精品久久久久久久星辰影院 | 91不卡在线| 亚洲丝袜天堂 | 一区二区三区视频 | 欧美三区 | 欧美综合一区 | 欧美日韩电影在线 | 在线亚洲人成电影网站色www | 91精品久久久久久综合五月天 | 国产成人精品午夜视频免费 | 亚洲激情在线 | 免费人成激情视频在线观看冫 |