首頁 >後端開發 >php教程 >php 類別與物件全面了解

php 類別與物件全面了解

怪我咯
怪我咯原創
2017-06-28 13:50:191712瀏覽

目錄

PHP 類別與物件 全解析(一)

PHP 類別與物件全解析( 二)

PHP 類別與物件全解析(三)

1.類別與物件

物件:實際存在該類別事物中每個實物的個體。 $a =new User(); 實例化後的$a
引用:php的別名,兩個不同的變數名字指向相同的內容

#封裝: 把物件的屬性和方法組織在一個類別(邏輯單元)裡
繼承:以原有的類別為基礎,創建一個新類,從而程式碼復用的目的;
多態:允許將子類別類型的指標賦值給父類別類型的指標。
-------------------------------------

2.自動載入物件:

自動載入透過定義特殊的autoload函數,當引用沒有在腳本中定義的類別時會自動呼叫這個函數.

[php] view plaincopyprint?
 function autoload($class){
   require_once("classes/$class.class.php");
 }

為什麼要使用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推薦了一個最受歡迎的辦法,在檔案名稱中包含路徑。例如下面的範例:

[php] view plaincopyprint?

    view sourceprint?  
    // Main.class    
      
    function autoload($class_name) {     
         $path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);     
         require_once $path.'.php';     
     }

temp = new Main_Super_Class();

#所有的底線都會被替換成路徑中的分隔符,上例就會去Main/Super/Class. php文件。

缺點:

是在編碼過程中,必須明確的知道程式碼檔案應當所處的位置,

而且由於將檔案路徑硬編碼在了類別名稱中,如果需要修改資料夾的結構時,我們必須手動修改所有的類別名稱。

如果是在一個開發環境中,並且對於速度不是很在意的話,使用'Include All’這個方法是非常方便的。
透過將所有類別檔案放在一個或幾個特定資料夾中,然後透過遍歷的方式來尋找載入。
例如

   <?php     
      
    $arr = array (     
         &#39;Project/Classes&#39;,     
        &#39;Project/Classes/Children&#39;,     
        &#39;Project/Interfaces&#39;    
     );    
      
     foreach($arr as $dir) {     
      
        $dir_list = opendir($dir);    
      
        while ($file = readdir($dir_list)) {     
             $path = $dir.DIRECTORY_SEPARATOR.$file;     
             if(in_array($file, array(&#39;.&#39;, &#39;..&#39;)) || is_dir($path))     
                 continue;    
             if (strpos($file, ".class.php"))     
                 require_once $path;     
         }     
    }     
      
     ?>

另一個方法是在類別檔案和他的位置之間建立關聯的設定檔,例如:

    view sourceprint?  
    // configuration.php           
    array_of_associations = array(     
        &#39;MainSuperClass&#39; = &#39;C:/Main/Super/Class.php&#39;,     
        &#39;MainPoorClass&#39; = &#39;C:/blablabla/gy.php&#39;    
     );

呼叫的檔案

    <?php     
        require &#39;autoload_generated.php&#39;;    
        function autoload($className) {     
           global $autoload_list;     
           require_once $autoload_list[$className];     
        }    
          $x = new A();     
    ?>

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

3.建構子與析構函式

PHP 建構方法 construct() 允許在實例化一個類別之前先執行建構方法。

建構方法是類別中的一個特殊方法。當使用 new 操作符建立一個類別的實例時,建構方法將會自動調用,其名稱必須是 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 = &#39;Public&#39;;  
    protected $protected = &#39;Protected&#39;;  
    private $private = &#39;Private&#39;;  
  
    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 = &#39;static var&#39;;  
      
        public static function doubleColon() {  
            echo parent::CONST_VALUE . "\n";  
            echo self::$my_static . "\n";  
        }  
    }  
      
    OtherClass::doubleColon();  
    ?>

以上是php 類別與物件全面了解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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