程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 類與對象 全解析( 一)

PHP 類與對象 全解析( 一)

編輯:關於PHP編程

PHP 類與對象 全解析( 一)


1.類與對象   對象:實際存在該類事物中每個實物的個體。$a =new User(); 實例化後的$a 引用:php的別名,兩個不同的變量名字指向相同的內容   封裝: 把對象的屬性和方法組織在一個類(邏輯單元)裡 繼承:以原有的類為基礎,創建一個新類,從而代碼復用的目的; 多態:允許將子類類型的指針賦值給父類類型的指針。 -------------------------------------   2.自動加載對象: 自動加載通過定義特殊的__autoload函數,當引用沒有在腳本中定義的類時會自動調用這個函數.   1 [php] view plaincopyprint? 2 function __autoload($class){   3   require_once("classes/$class.class.php");   4 }   為什麼要使用__autoload   1,首先是不知道這個類文件存放在什麼地方, 2,另外一個就是不知道什麼時候需要用到這個文件。 3,特別是項目文件特別多時,不可能每個文件都在開始的部分寫很長一串的 require …     替代了一 require_once ("classes/Books.class.php") ;  require_once ("classes/Employees.class.php" ) ;  require_once ("classes/Events.class.php") ;  require_once ("classes/Patrons.class.php") ;   zend推薦了一種最流行的辦法,在文件名中包含路徑。例如下面的例子:         1 [php] view plaincopyprint? 2  3     view sourceprint?   4     // Main.class     5        6     function __autoload($class_name) {      7          $path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);      8          require_once $path.'.php';      9      }           temp = new Main_Super_Class();   所有的下劃線都會被替換成路徑中的分隔符,上例中就會去 Main/Super/Class.php文件。   缺點:   是在編碼過程中,必須明確的知道代碼文件應當所處的位置,   而且由於將文件路徑硬編碼在了類名中,如果需要修改文件夾的結構時,我們必須手工修改所有的類名。   如果是在一個開發環境中,並且對於速度不是很在意的話,使用'Include All’這個方法是非常方便的。 通過將所有類文件放在一個或幾個特定文件夾中,然後通過遍歷的方式查找加載。 例如         <?php                 $arr = array (               'Project/Classes',              'Project/Classes/Children',              'Project/Interfaces'          );                 foreach($arr as $dir) {                     $dir_list = opendir($dir);                    while ($file = readdir($dir_list)) {                   $path = $dir.DIRECTORY_SEPARATOR.$file;                   if(in_array($file, array('.', '..')) || is_dir($path))                       continue;                  if (strpos($file, ".class.php"))                       require_once $path;               }          }                  ?>          另外一個方法是在類文件和他的位置之間建立關聯的配置文件,例如:         view sourceprint?       // configuration.php                 array_of_associations = array(              'MainSuperClass' = 'C:/Main/Super/Class.php',              'MainPoorClass' = 'C:/blablabla/gy.php'          );          調用的文件         <?php              require 'autoload_generated.php';             function __autoload($className) {                 global $autoload_list;                 require_once $autoload_list[$className];              }               $x = new A();          ?>          ------------------------------------------------     3.構造函數和析構函數     PHP 構造方法 __construct() 允許在實例化一個類之前先執行構造方法。   構造方法是類中的一個特殊方法。當使用 new 操作符創建一個類的實例時,構造方法將會自動調用,其名稱必須是 __construct() 。   (在一個類中只能聲明一個構造方法,而是只有在每次創建對象的時候都會去調用一次構造方法,不能主動的調用這個方法, 所以通常用它執行一些有用的初始化任務。該方法無返回值。)   作用: 用來創建對象時初始化對象 子類執行分類的構造函數parent::__construct().   析構函數: __destruct ()定義:特殊的內成員函數,沒有返回類型,沒有參數,不能隨意調用,也沒有重載;         只是在類對象生命結束的時候,由系統自動調用釋放在構造函數中分配的資源。     與構造方法對應的就是析構方法,析構方法允許在銷毀一個類之前執行的一些操作或完成一些功能,比如說關閉文件、釋放結果集等。   析構函數不能帶有任何參數,其名稱必須是 __destruct() 。  作用:清理了善後工作,例如,在建立對象時使用new 開辟了一個內存空間,應在退出前使用析構函數釋放在構造函數中分配的資源。   例子:         class Person {           public $name;           public $age;                  //定義一個構造方法初始化賦值           public function __construct($name,$age) {               $this->name=$name;               $this->age=$age;           }           public function say() {               echo "my name is :".$this->name."<br />";               echo "my age is :".$this->age;           }           //析構函數           function __destruct()           {               echo "goodbye :".$this->name;           }       }              $p1=new Person("ren", 25);       $p1->say();         ---------------------------------------------------------------     4 .訪問控制   對屬性或方法的訪問控制,是通過在前面添加關鍵字 public、protected 或 private 來實現的  public 所定義的類成員可以在任何地方被訪問;  protected 所定義的類成員則可以被其所在類的子類和父類訪問(當然,該成員所在的類也可以訪問);  private 定義的類成員則只能被其所在類訪問。  對類成員的訪問控制  類成員都必須使用關鍵字public、protected 或 private 進行定義   對方法的訪問控制 類中的方法都必須使用關鍵字public、protected 或 private 進行定義。如果沒有設置這些關鍵字,則該方法會被設置成默認的 public。   例子:     class MyClass   {       public $public = 'Public';       protected $protected = 'Protected';       private $private = 'Private';          function printHello()       {           echo $this->public;           echo $this->protected;           echo $this->private;       }   }      $obj = new MyClass();   echo $obj->public; // 這行能被正常執行   echo $obj->protected; // 這行會產生一個致命錯誤   echo $obj->private; // 這行也會產生一個致命錯誤   $obj->printHello(); // 輸出 Public、Protected 和 Private      -------------------------------------------------------------     5 .對象繼承       繼承定義:以原有的類為基礎,創建一個新類,從而代碼復用的目的; -------------------------------------- 覆寫是對象繼承時用到的 重載是單對象中同方法名不同參數的方法 --------------------------------------   繼承已為大家所熟知的一個程序設計特性,PHP 的對象模型也使用了繼承。繼承將會影響到類與類,對象與對象之間的關系。   比如,當擴展一個類,子類就會繼承父類的所有公有和保護方法。但是子類的方法會覆蓋父類的方法。   繼承對於功能的設計和抽象是非常有用的,而且對於類似的對象增加新功能就無須重新再寫這些公用的功能。         class Person {           public $name;           public $age;                  function say() {               echo "my name is:".$this->name."<br />";           echo "my age is:".$this->age;           }       }              // 類的繼承       class Student extends Person {           var $school;    //學生所在學校的屬性                      function study() {               echo "my name is:".$this->name."<br />";               echo "my shool is:".$this->school;           }              }              $t1 = new Student();       $t1->name = "zhangsan";       $t1->school = "beijindaxue";       $t1->study();         -------  ---------  ------   ---------  --------   -----     6 .范圍解析操作符(::)     范圍解析操作符(也可稱作 Paamayim Nekudotayim)或者更簡單地說是一對冒號,可以用於訪問靜態成員、方法和常量,還可以用於覆蓋類中的成員和方法。 當在類的外部訪問這些靜態成員、方法和常量時,必須使用類的名字。   self 和 parent 這兩個特殊的關鍵字是用於在類的內部對成員或方法進行訪問的。 注意: 當一個子類覆蓋其父類中的方法時,PHP 不會再執行父類中已被覆蓋的方法,直到子類中調用這些方法為止     例子:         <?php       class OtherClass extends MyClass       {           public static $my_static = 'static var';                  public static function doubleColon() {               echo parent::CONST_VALUE . "\n";               echo self::$my_static . "\n";           }       }              OtherClass::doubleColon();       ?>   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved