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操做系统中,因为其文件系统默认区分大小写,所以类的名称与类定义文件的名称的大小写需保持一致,不然将会报错。 为了兼容考虑,建议类名与类定义文件的名称最好保持大小写一致。

相关文章
相关标签/搜索