天天看點

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();  
    ?>         

---------------------------------------------------