php _autoload自動(dòng)加載類與機(jī)制分析
更新時(shí)間:2012年02月10日 16:54:02 作者:
在使用PHP的OO模式開發(fā)系統(tǒng)時(shí),通常大家習(xí)慣上將每個(gè)類的實(shí)現(xiàn)都存放在一個(gè)單獨(dú)的文件里,這樣會(huì)很容易實(shí)現(xiàn)對(duì)類進(jìn)行復(fù)用,同時(shí)將來維護(hù)時(shí)也很便利。這也是OO設(shè)計(jì)的基本思想之一
在PHP5之前,如果需要使用一個(gè)類,只需要直接使用include/require將其包含進(jìn)來即可
test.class.php
<?php
class abc{
function __construct()
{
echo 'www.hzhuti.com;
}
}
?>
load.php
代碼如下
<?php
class LOAD
{
static function loadClass($class_name)
{
$filename = $class_name.".class.php";
if (is_file($filename)) return include_once $filename;
}
}
/**
* 設(shè)置對(duì)象的自動(dòng)載入
* spl_autoload_register — Register given function as __autoload() implementation
*/
spl_autoload_register(array('LOAD', 'loadClass'));
$a = new Test();//實(shí)現(xiàn)自動(dòng)加載,很多框架就用這種方法自動(dòng)加載類
?>
__autoload()
在實(shí)際項(xiàng)目中,不可能把所有的類都寫在一個(gè) PHP 文件中,當(dāng)在一個(gè) PHP 文件中需要調(diào)用另一個(gè)文件中聲明的類時(shí),就需要通過 include 把這個(gè)文件引入。不過有的時(shí)候,在文件眾多的項(xiàng)目中,要一一將所需類的文件都 include 進(jìn)來,一個(gè)很大的煩惱是不得不在每個(gè)類文件開頭寫一個(gè)長(zhǎng)長(zhǎng)的包含文件的列表。我們能不能在用到什么類的時(shí)候,再把這個(gè)類所在的 php 文件導(dǎo)入呢?
為此,PHP 提供了 __autoload() 方法,它會(huì)在試圖使用尚未被定義的類時(shí)自動(dòng)調(diào)用。通過調(diào)用此函數(shù),腳本引擎在 PHP 出錯(cuò)失敗前有了最后一個(gè)機(jī)會(huì)加載所需的類。
__autoload() 方法接收的一個(gè)參數(shù),就是欲加載的類的類名,所以這時(shí)候需要類名與文件名對(duì)應(yīng),如 Person.php ,對(duì)應(yīng)的類名就是 Pserson 。
下面看個(gè)完整的實(shí)例
class ClassA{
public function __construct(){
echo “ClassA load success!”;
}
}
//定義一個(gè)類ClassA,文件名為ClassA.php
class ClassA{
public function __construct(){
echo “ClassA load success!”;
}
}
class ClassB extends ClassA {
public function __construct(){
//parent::__construct();
echo “ClassB load success!”;
}
}
//定義一個(gè)類ClassB,文件名為ClassB.php,ClassB繼承ClassA
class ClassB extends ClassA {
public function __construct(){
//parent::__construct();
echo “ClassB load success!”;
}
}
定義兩個(gè)測(cè)試用的類之后,我們來編寫一個(gè)含有__autoload()方法的PHP運(yùn)行程序文件如下:
function __autoload($classname){
$classpath=”./”.$classname.'.php';
if(file_exists($classpath)){
require_once($classpath);
}
else{
echo ‘class file'.$classpath.'not found!';
}
}
$newobj = new ClassA();
$newobj = new ClassB();
test.class.php
復(fù)制代碼 代碼如下:
<?php
class abc{
function __construct()
{
echo 'www.hzhuti.com;
}
}
?>
load.php
代碼如下
復(fù)制代碼 代碼如下:
<?php
class LOAD
{
static function loadClass($class_name)
{
$filename = $class_name.".class.php";
if (is_file($filename)) return include_once $filename;
}
}
/**
* 設(shè)置對(duì)象的自動(dòng)載入
* spl_autoload_register — Register given function as __autoload() implementation
*/
spl_autoload_register(array('LOAD', 'loadClass'));
$a = new Test();//實(shí)現(xiàn)自動(dòng)加載,很多框架就用這種方法自動(dòng)加載類
?>
__autoload()
在實(shí)際項(xiàng)目中,不可能把所有的類都寫在一個(gè) PHP 文件中,當(dāng)在一個(gè) PHP 文件中需要調(diào)用另一個(gè)文件中聲明的類時(shí),就需要通過 include 把這個(gè)文件引入。不過有的時(shí)候,在文件眾多的項(xiàng)目中,要一一將所需類的文件都 include 進(jìn)來,一個(gè)很大的煩惱是不得不在每個(gè)類文件開頭寫一個(gè)長(zhǎng)長(zhǎng)的包含文件的列表。我們能不能在用到什么類的時(shí)候,再把這個(gè)類所在的 php 文件導(dǎo)入呢?
為此,PHP 提供了 __autoload() 方法,它會(huì)在試圖使用尚未被定義的類時(shí)自動(dòng)調(diào)用。通過調(diào)用此函數(shù),腳本引擎在 PHP 出錯(cuò)失敗前有了最后一個(gè)機(jī)會(huì)加載所需的類。
__autoload() 方法接收的一個(gè)參數(shù),就是欲加載的類的類名,所以這時(shí)候需要類名與文件名對(duì)應(yīng),如 Person.php ,對(duì)應(yīng)的類名就是 Pserson 。
下面看個(gè)完整的實(shí)例
復(fù)制代碼 代碼如下:
class ClassA{
public function __construct(){
echo “ClassA load success!”;
}
}
//定義一個(gè)類ClassA,文件名為ClassA.php
class ClassA{
public function __construct(){
echo “ClassA load success!”;
}
}
class ClassB extends ClassA {
public function __construct(){
//parent::__construct();
echo “ClassB load success!”;
}
}
//定義一個(gè)類ClassB,文件名為ClassB.php,ClassB繼承ClassA
class ClassB extends ClassA {
public function __construct(){
//parent::__construct();
echo “ClassB load success!”;
}
}
定義兩個(gè)測(cè)試用的類之后,我們來編寫一個(gè)含有__autoload()方法的PHP運(yùn)行程序文件如下:
復(fù)制代碼 代碼如下:
function __autoload($classname){
$classpath=”./”.$classname.'.php';
if(file_exists($classpath)){
require_once($classpath);
}
else{
echo ‘class file'.$classpath.'not found!';
}
}
$newobj = new ClassA();
$newobj = new ClassB();
您可能感興趣的文章:
- PHP命名空間和自動(dòng)加載類
- PHP中類的自動(dòng)加載的方法
- PHP實(shí)現(xiàn)的簡(jiǎn)單路由和類自動(dòng)加載功能
- PHP命名空間與自動(dòng)加載類詳解
- 解析php類的注冊(cè)與自動(dòng)加載
- php類的自動(dòng)加載操作實(shí)例詳解
- php類自動(dòng)加載器實(shí)現(xiàn)方法
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之命名空間與自動(dòng)加載類詳解
- PHP類的自動(dòng)加載機(jī)制實(shí)現(xiàn)方法分析
- PHP MVC框架中類的自動(dòng)加載機(jī)制實(shí)例分析
- PHP命名空間(Namespace)的使用詳解
- PHP類的自動(dòng)加載與命名空間用法實(shí)例分析
相關(guān)文章
VML繪圖板②腳本--VMLgraph.js、XMLtool.js
VML繪圖板②腳本--VMLgraph.js、XMLtool.js...2006-10-10用PHP將數(shù)據(jù)導(dǎo)入到Foxmail
用PHP將數(shù)據(jù)導(dǎo)入到Foxmail...2006-10-10分頁顯示Oracle數(shù)據(jù)庫(kù)記錄的類之二
分頁顯示Oracle數(shù)據(jù)庫(kù)記錄的類之二...2006-10-10