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