平时总使用composer,反而对自动加载的知识有些陌生啦,重新梳理下php中自动加载的知识
首先php中定义一个类当使用的时候需要将包含改类的文件引用进来才可以使用,例如
这种情况下如果类文件少的话还可以,但是如果类文件多的话,一个个去 require 岂不是要烦死
php中给出了两种解决方法:
__autoload($className)【不推荐】
在php的低版本中支持使用 __autoload 函数来自动获取 new 关键后面的类名,然后根据类名再去加载相应的类文件,代码如下
运行结果
需要加载Student类的类文件
实例化Student类
需要加载Teacher类的类文件
实例化Teacher类
spl_autoload_register()
官方文档: https://www.php.net/manual/zh/function.spl-autoload-register.php
其实它与 __autoload 使用上的区别就是,这个函数可以注册多个自动加载函数。我们上面的例子可以改成这种
目录如下
sql_autoload_register() 除了支持自定义函数外还可以使用 类名:静态方法 的方式
随着项目的越来越复杂,我们会把不同的类放到不同的目录中,这时候就需要定义相应的加载函数加载到 spl_autoload_register() 中 项目结构及代码如下
<?php define("DIR",dirname(__FILE__)); function autoload($className){ echo "需要加载".$className."类的类文件".PHP_EOL; $file_path = str_replace('\', DIRECTORY_SEPARATOR, DIR .'\Controller\'. $className).'.php'; if(file_exists($file_path)){ include $file_path; } } function autoload1($className){ echo "需要加载".$className."类的类文件".PHP_EOL; $file_path = str_replace('\', DIRECTORY_SEPARATOR, DIR .'\Model\'. $className).'.php'; if(file_exists($file_path)){ include $file_path; } } spl_autoload_register("autoload"); spl_autoload_register("autoload1"); new Student(); new Teacher();
这时候会发现很不方便,这个时候我们就需要引入命名空间
spl_autoload_register+命名空间
为每个类引入命名空间,然后在实例化一个对象的时候 注册函数中的 $className 会带上函数的命名空间路径,这样就避免了写多个注册函数的问题,示例如下:
目录结构没有变
Student.php
<?php namespace Controller; class Student{ public function __construct() { echo "实例化Student类".PHP_EOL; } }
Teacher.php
<?php namespace Model; class Teacher{ public function __construct() { echo "实例化Teacher类".PHP_EOL; } }
index.php
<?php use ControllerStudent; use ModelTeacher; define("DIR",dirname(__FILE__)); function autoload($className){ echo "需要加载".$className."类的类文件".PHP_EOL; // DIRECTORY_SEPARATOR php中内置目录分隔符 $file_path = str_replace('\', DIRECTORY_SEPARATOR, DIR .'\'. $className).'.php'; include $file_path; } spl_autoload_register("autoload"); new Student(); new Teacher();
运行结果
需要加载ControllerStudent类的类文件 /home/www/pdemo/demo/Controller/Student.php 实例化Student类 需要加载ModelTeacher类的类文件 /home/www/pdemo/demo/Model/Teacher.php 实例化Teacher类