PHP 類別與物件 全解析(一)
PHP 類別與物件全解析( 二)
PHP 類別與物件全解析(三)
物件:實際存在該類別事物中每個實物的個體。 $a =new User(); 實例化後的$a
引用:php的別名,兩個不同的變數名字指向相同的內容
#封裝: 把物件的屬性和方法組織在一個類別(邏輯單元)裡
繼承:以原有的類別為基礎,創建一個新類,從而程式碼復用的目的;
多態:允許將子類別類型的指標賦值給父類別類型的指標。
-------------------------------------
自動載入透過定義特殊的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 ( '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(); ?>
--------------------------------------------- ---
PHP 建構方法 construct() 允許在實例化一個類別之前先執行建構方法。
建構方法是類別中的一個特殊方法。當使用 new 操作符建立一個類別的實例時,建構方法將會自動調用,其名稱必須是 construct() 。
(在一個類別中只能宣告一個建構方法,而是只有在每次建立物件的時候都會去呼叫一次建構方法,不能主動的呼叫這個方法,
所以通常用它執行一些有用的初始化任務。 .
析構函數: destruct ()定義:特殊的內成員函數,沒有回傳類型,沒有參數,不能隨意調用,也沒有重載;
在類物件生命結束的時候,由系統自動呼叫釋放在建構函數中分配的資源。
與建構方法對應的就是析構方法,析構方法允許在銷毀一個類別之前執行的一些操作或完成一些功能,比如說關閉檔案、釋放結果集等。
析構函數不能帶有任何參數,其名稱必須是 destruct() 。
範例:
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();
存取控制
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
-------------------------------------------------------------
继承定义:以原有的类为基础,创建一个新类,从而代码复用的目的;
--------------------------------------
覆写是对象继承时用到的
重载是单对象中同方法名不同参数的方法
--------------------------------------
继承已为大家所熟知的一个程序设计特性,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();
------- --------- ------ --------- -------- -----
范围解析操作符(也可称作 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(); ?>
以上是php 類別與物件全面了解的詳細內容。更多資訊請關注PHP中文網其他相關文章!