PHP使用__autoload()自動加載未定義的類

稍微瞭解PHP發展歷史的人都知道,PHP最初誕生的時候只支持面向過程化的編碼方式,不過隨着PHP在web開發領域愈來愈流行以及大型web站點建設的須要,從PHP 4開始,PHP也開始支持面向對象編程了。此外,隨着PHP 5的發佈,尤爲是PHP針對面向對象特性的不斷完善,在目前的PHP程序開發中,面向對象編程以及基於面向對象的PHP MVC框架的程序開發已經成了主流的選擇。php

下面,咱們先來看一個簡單的PHP Class(類)的代碼示例web

<?php
/**
 * 用於表示網站站點的PHP類
 */
class Site{
    public $name;   //站點名稱
    public $email;  //站點郵箱
    public $url;    //站點網址
    
    //顯示歡迎信息的函數
    public function sayHi(){
        echo "歡迎來到{$this->name}({$this->url}),你能夠發送郵件到{$this->email}來聯繫我!";
    }
}

$site = new Site(); //實例化一個Site(站點)對象
$site->name = 'CodePlayer';
$site->email = 'admin@365mini.com';
$site->url = 'http://www.365mini.com';

$site->sayHi();
//輸出:歡迎來到CodePlayer(http://www.365mini.com),你能夠發送郵件到admin@365mini.com來聯繫我!
?>

在上面的例子中,爲了便於理解,咱們將類的定義和相關調用放在了同一個文件中。不過,在正式的程序開發中,咱們通常會將單個類的定義放在一個PHP文件中,而且PHP文件的名稱通常命名爲類名.class.php。這樣,在須要使用該類的時候,咱們只須要調用require_oncerequireinclude等指令來包含該類文件便可。譬如,上面的例子,咱們將其拆分爲兩個文件,兩個文件(Site.class.phpsample.php)的代碼分別以下:編程

(Site.class.php文件)框架

<?php
/**
 * 用於表示網站站點的PHP類
 */
class Site{
    public $name;   //站點名稱
    public $email;  //站點郵箱
    public $url;    //站點網址
    
    //顯示歡迎信息的函數
    public function sayHi(){
        echo "歡迎來到{$this->name}({$this->url}),你能夠發送郵件到{$this->email}來聯繫我!";
    }
}
?>

(sample.php文件)函數

<?php
require_once 'Site.class.php';  //包含Site.class.php文件
$site = new Site(); //實例化一個Site(站點)對象
$site->name = 'CodePlayer';
$site->email = 'admin@365mini.com';
$site->url = 'http://www.365mini.com';

$site->sayHi();
//輸出:歡迎來到CodePlayer(http://www.365mini.com),你能夠發送郵件到admin@365mini.com來聯繫我!
?>

不過,這樣仍然感受有些麻煩,尤爲是在大型站點的程序開發中,涉及到的類可能很是多,須要使用這些類的PHP文件固然就更多了,若是每一個須要使用的地方都來上幾句require_once(或其餘包含指令),那是否是就感受有些繁瑣了呢,並且這樣也不利於後期的程序維護。因而咱們思考,有沒有這樣一種方式:只要咱們建立(new)一個類的對象,而且以前的代碼也沒有包含對應類的定義文件,PHP就能幫咱們自動將對應的類文件包含進來呢?網站

答案固然是確定的,從PHP 5開始,PHP爲咱們提供了一個神奇的函數——__autoload(),它就能夠幫咱們實現這樣的功能。只要咱們在使用類以前定義一個名爲__autoload()的函數,當咱們在PHP中new一個類的實例時,若是PHP在以前的運行代碼中找不到該類的定義,那麼它就會自動調用__autoload()函數,而且將對應的類名做爲參數傳遞進去。ui

這裏,咱們來看一個具體的例子,假設咱們將全部的類定義文件都放在PHP站點根目錄的class文件夾下,而且類定義文件的命名方式統一爲類名.class.php。那麼,咱們就能夠以下編寫__autoload()函數。this

(functions.php文件)編碼

<?php
define('ABSPATH', dirname(__FILE__)); //定義ABSPATH常量,用於表示站點根目錄的絕對路徑
/**
 * 自動加載未定義的類文件
 * @param string $classname
 */
function __autoload($classname){
    require_once ABSPATH.'/class/'.$classname.'.class.php';         
}
?>

(sample.php文件)url

<?php
require_once 'functions.php';   //包含進定義__autoload()函數的文件
$site = new Site(); //實例化一個Site(站點)對象,此時自動調用__autoload()函數
$site->name = 'CodePlayer';
$site->email = 'admin@365mini.com';
$site->url = 'http://www.365mini.com';

$site->sayHi();
//輸出:歡迎來到CodePlayer(http://www.365mini.com),你能夠發送郵件到admin@365mini.com來聯繫我!

//$p = new Person(); 若是還要使用其餘類對象,直接建立便可
//$emp = new Employee();
?>

注意:在Windows操做系統中,因爲其文件系統不區分大小寫,所以類的名稱與類定義文件的名稱的大小寫能夠不一致。例如,PHP類名爲Person,定義該類的PHP文件名稱爲person.class.phpPerson.class.php均不會出錯。不過在Linux操做系統中,因爲其文件系統默認區分大小寫,所以類的名稱與類定義文件的名稱的大小寫需保持一致,不然將會報錯。 爲了兼容考慮,建議類名與類定義文件的名稱最好保持大小寫一致。

相關文章
相關標籤/搜索