PHP中的类加载
- 手动加载类
<?php
//定义类文件路径
$class_path='c/include/Animal.php';
if(!class_exists('Animal')){ //判断类是否存在
if(file_exists($class_path)){//判断类文件是否存在,如果存在就加载类文件
include_once $class_path;
}
}
$a=new Animal();//实例化类
__autoload()
方法自动加载类.(注意:PHP 7.2.0 起废弃。强烈建议不要使用该方法)
/**
** $className 类名(这个参数必须有)
*/
$a=new Animal();
function __autoload($className){
$class_path='c/include/'.$className.'php';
if(file_exists($class_path)){
include_once $class_path;
}
}
$a=new Animal();//实例化类
spl_autoload_register()
方法自动加载类(强烈推荐)
//考虑一种情况:一个项目的类文件放在了不同的目录中,比如:require文件夹和include文件夹中。
/**
**加载require文件夹下的类
*/
function require_autoload($className){
$r_path=ROOT_PATH.'/require/'.$className.'.php';
if(file_exists($r_path)){
include_once $r_path;
}
}
/**
**加载include文件夹下的类
*/
function include_autoload($className){
$i_path=ROOT_PATH.'/include/'.$className.'.php';
if(file_exists($i_path)){
include_once $i_path;
}
}
//最重要的一步
spl_autoload_register('require_autoload');
spl_autoload_register('include_autoload');
通过以上三步,你的require文件夹和include文件夹中存放的类文件,在被脚本调用的时候将会自动被加载。
在需要实例化的时候只需要直接new就行了,比如:
$a=new Animal();此时会自动加载Animal.php进来,但前提是Animal.php文件确实存在于require或include文件夹中,且有Animal类。
- 综合应用:封装一个自动加载类
//新建Autoload.php
//代码如下:
class Autoload{
public function __construct(){
$this->register();
}
/**
** $className 类名
** $r_path 类文件存放目录1
** $i_path 类文件存放目录2
*/
private function _autoload($className){//$className必须有
$r_path=ROOT_PATH.'/require/'.$className.'.php';//定义类文件存放目录1
$i_path=ROOT_PATH.'/include/'.$className.'.php';//定义类文件存放目录2
//在目录1中查找类文件,找不到就去目录2中找,两个目录中都找不到就提示“类文件不存在!”。
if(file_exists($r_path)){
include_once $r_path;
}elseif(file_exists($i_path)){
include_once $i_path;
}else{
die($className.'类文件不存在!');
}
}
private function register(){
spl_autoload_register(array(__CLASS__,'_autoload'));
}
}
测试:
新建两个文件夹分别命名为:include、require。
1、在include中新建Animal.php,代码如下:
class Animal{
public function __construct(){
echo __METHOD__;
}
}
在require文件夹中新建Human.php,代码如下:
class Human{
public function __construct(){
echo __METHOD__;
}
}
在Autoload.php中类主体之外添加如下代码测试能否自动加载Animal和Human类
$load=new Autoload();
$a=new Animal();
echo '<hr />';
$h=new Human();
输出的内容如下:
Animal::__construct
=============================================================================
Human::__construct
还望大佬们不要笑话,有不对的或者值得改进的地方请留言告诉我以便我能学习、进步.