稍微瞭解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_once
、require
、include
等指令來包含該類文件便可。譬如,上面的例子,咱們將其拆分爲兩個文件,兩個文件(Site.class.php
和sample.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.php
和Person.class.php
均不會出錯。不過在Linux操做系統中,因爲其文件系統默認區分大小寫,所以類的名稱與類定義文件的名稱的大小寫需保持一致,不然將會報錯。 爲了兼容考慮,建議類名與類定義文件的名稱最好保持大小寫一致。