spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)
spl_autoload_register(‘func_name');
spl_autoload_register(array(‘class_name','method_name'));
spl_autoload_register() 只能加载同级的文件 如果需要其他级的文件 如下
function my_autoload ($ClassName) {
include(__DIR__ . "/classes/" . $pClassName . ".php");
}
spl_autoload_register("my_autoload");
以下是自己写的一个简单的的mvc实现
// use Matrix\Autoloader;
class AutoloadPsr4 {
public $maps = [];
public function __construct()
{
echo "1";
spl_autoload_register([$this,'autoload']); // 只要调用没有的类 就会调用此函数 自动注册类
}
// 自己写的自动加载函数
public function autoload($classname) {
// 完整的类名由命名空间和文件名称组成
// 得到命名空间 根据命名空间 得到文件路径名名称
$pos = strrpos($classname,'\\');
$namespace = substr($classname,0,$pos);
$realclass = substr($classname,$pos+1);
$this->mapload($namespace,$realclass);
}
public function mapload($namespace,$realclass) {
if(array_key_exists($namespace,$this->maps)) {
$namespace = $this->maps[$namespace];
} else {
echo "map中空间没有对应的路径";
}
echo "namespace=".$namespace;
echo "<br>";
echo "realclass=".$realclass;
echo "<br>";
$path = rtrim(str_replace('\\',"/",$namespace),'/')."/";
echo "path=".$path;
echo "<br>";
$filepath = $path.$realclass.".php";
echo "filepath=".$filepath;
echo "<br>";
if (file_exists($filepath)) {
include($filepath);
}else{
die("路径不对");
}
}
public function addMaps($namespace,$path) {
if (array_key_exists($namespace,$this->maps)) {
die("此命名空间已经存在");
}
$this->maps[$namespace] = $path;
}
}
// 命名空间和路径不一致 需要添加 命名空间和路径的映射
// $a = isset($_GET['a']) ? $_GET['a'] : "index";
// $m = isset($_GET['m']) ? $_GET['m'] : "index";
// $auto = new AutoloadPsr4();
// $auto -> addMaps("controller","app/controller"); // 添加空间 命名隐射
// $m = ucfirst(strtolower($m));
// $namespace = "controller\\".$m."Controller";
// $obj = new $namespace();
// call_user_func([$obj,$a])
// 路径和命名空间一致
$a = isset($_GET['a']) ? $_GET['a'] : "index";
$m = isset($_GET['m']) ? $_GET['m'] : "index";
$auto = new AutoloadPsr4(); // 注册spl_autoload_register 只要注册了 以后调用类就会自动加载
$m = ucfirst(strtolower($m));
$namespace = "app\controller\\".$m."Controller"; // 这里的app\controller 是固定的是写死的
$obj = new $namespace();
call_user_func([$obj,$a])
// E:\phpstudy_pro\WWW\mvc\index.php
namespace app\controller;
class IndexController {
public function index() {
echo "这是is".__METHOD__;
}
public function demo() {
echo "这是demo方法";
}
}
// E:\phpstudy_pro\WWW\mvc\app\controller\IndexController.php
namespace 用来定义命名空间
new \app\controller\indexcontroller.php 用来调用
调用 的时候还要 包含这个文件