1. 程式人生 > >final,類的自動加載,命名空間

final,類的自動加載,命名空間

父類 建議 spa ech 如果 include 自動 自定義 要去

final是幹什麽的
一般是為了防止父類的一個方法被重寫
如果父類中的方法被聲明為 final,則子類無法覆蓋該方法。如果一個類被聲明為 final,則不能被繼承。
Note: 屬性不能被定義為 final,只有類和方法才能被定義為 final。

類的自動加載
類的自動加載是指,在外面的頁面中,並不需要去“引入”類文件,但是程序會在需要的時候動態加載需要的類文件。
spl_autoload_register() 函數可以註冊任意數量的自動加載器,當使用尚未被定義的類(class)和接口(interface)時自動去加載。通過註冊自動加載器,腳本引擎在 PHP 出錯失敗前有了最後一個機會加載所需的類。

PHP的類自動加載機制
在PHP開發過程中,如果希望從外部引入一個class,通常會使用include和require方法,去把定義這個class的文件包含進來。這個在小規模開發的時候,沒什麽大問題。但在大型的開發項目中,這麽做會產生大量的require或者include方法調用,這樣不因降低效率,而且使得代碼難以維護,況且require_once的代價很大。
在PHP5之前,各個php框架如果要實現類的自動加載,一般都是按照某種約定自己實現一個遍歷目錄,自動加載所有符合約定規則的文件的類或函數。 當然,PHP5之前對面向對象的支持並不是太好,類的使用也沒有現在頻繁。 在PHP5後,當加載PHP類時,如果類所在文件沒有被包含進來,或者類名出錯,Zend引擎會自動調用__autoload 函數。此函數需要用戶自己實現__autoload函數。 在PHP5.1.2版本後,可以使用spl_autoload_register函數自定義自動加載處理函數。當沒有調用此函數,默認情況下會使用SPL自定義的spl_autoload函數。


PHP中類的自動加載的方法

使用__autoload魔術函數

<?php
//需要類是自動調用,而且會傳進來一個類名,這個案例的文件名為21A.class.php,類名為A
function __autoload($className){
require "./21".$className.".class.php";
}
$o1 = new A();
$o1->v1 = 10;
echo "<br/>v1:".$o1->v1;
?>

使用spl_autoload_register函數


<?php
//註冊兩個用於自動加載的函數名
spl_autoload_register(‘auto1‘);
spl_autoload_register(‘auto2‘);
function auto1($className){
$file = "./21".$className.".class.php";
if(file_exists($file)){
require "./21".$className.".class.php";
}
}
function auto1($className){
$file = "./22".$className.".class.php";
if(file_exists($file)){
require "./22".$className.".class.php";
}
}
//如果需要一個類,但這個頁面還沒有記載,就會依次調用auto1和auto2,知道找到該類文件並加載
?>

命名空間
用來解決在編寫類庫或應用程序時創建可重用的代碼如類或函數時碰到的兩類問題:

命名空間提供了一種將相關的類、函數和常量組合到一起的途徑

命名空間通過關鍵字namespace 來聲明。如果一個文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間。

<?php

/*
* namespace 命名空間
* 它必須在所有代碼的最前面
* 可以在一個文件中定義多個命名空間,但是不建議這樣做
*/

namespace MyProject ;

const CONNECT_OK = 1 ;
class Connection { /* ... */ }
function connect () { /* ... */ }

?>

final,類的自動加載,命名空間