面向对象之类自动加载
一、什么是类的自动加载
类的自动加载就是我们在实例化一个类的时候,不需要每次都手动去'require'来这个类文件,程序自动帮我们加载导入进来。
只要对应的类文件存在,并且命名符合规范(类名与文件名一致),直接调用即可
二、魔术方法__autoload
//定义一个函数,功能自动加载类文件,它自己会以类的名称作为参数 function __autoload($class){ //类文件的地址,类文件的格式是$class.class.php。解决Linux中的兼容问题 $classPath = str_replace('\\','/',__DIR__).'/'.$class.'.class.php'; if(file_exists($classPath)){ include_once $classPath; } }
三、spl_autoload_register()
如果项目小,使用__autoload()
就能实现基本的自动加载。但是有些时候我们需要不同的自动加载方法来加载不同路径的类文件。
spl_autoload_register()
提供了一种更加灵活、效率更好的方式来实现类的自动加载。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用
function load($className) { require $className . '.php'; } spl_autoload_register('load'); //将load函数注册到自动加载队列中。 $db = new DB(); //找不到DB类,就会自动去调用刚注册的load1函数了
类中使用
class MyClass{ public function loadFunction($class){ $classPath = str_replace('\\','/',__DIR__).'/'.$class.'.class.php'; if(file_exists($classPath)){ include_once $classPath; } } public function register(){ //注册自动加载方法loadFunction spl_autoload_register('self::loadFunction'); //或者参数为数组,数组的第一个元素为类名,第二个为要注册的方法名 //spl_autoload_register(array('MyClass','loadFunction')); } }
// 或者,自 PHP 5.3.0 起可以使用一个匿名函数
spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php'; });
其它使用场景
//静态调用 class demo { public static function myload(){} public static function run() { spl_autoload_register([__class__,'myload']); } } demo::run(); //非静态方法 class demo { public function myload(){} public function run() { spl_autoload_register([$this,'myload']); } } $d = new demo(); $d->run();
需要注意的是,如果你同时使用spl_autoload_register和autoload,autoload会失效!!!
五、类自动加载和namespace命名空间 的使用
index.php
/** 请求地址:index.php?c=index&a=index app -- model -- controller -- view */ $c = 'Index'; $a = 'Index'; # 定义主目录 defined('JK_ROOT') or define('JK_ROOT',__DIR__ ); require_once JK_ROOT . DIRECTORY_SEPARATOR .'loading.php'; spl_autoload_register('Loading::load'); $c = '\controller\\'.$c.'Controller'; $contr = new $c(); \controller\IndexController::talk();
loading.php
class Loading { public static function load($className) { //兼容linux $classPath = str_replace('\\',DIRECTORY_SEPARATOR,$className); $classFile = $classPath.'.php'; if( file_exists($classFile)){ require_once $classFile; }else{ exit($className . '不存在'); } } }
app\controller\IndexController.php
namespace controller; class IndexController { public function Index() { return 'hello world!'; } public static function talk() { echo 'my name jack!'; } }