一个完全标准的命名空间(namespace)和类(class)的结构是这样的:
\<Vendor Name>\(<Namespace>\)*<Class Name>
每个命名空间(namespace)都必须有一个顶级的空间名(namespace)("组织名(Vendor Name)")。
每个命名空间(namespace)中可以根据需要使用任意数量的子命名空间(sub-namespace)。
从文件系统中加载源文件时,空间名(namespace)中的分隔符将被转换为 DIRECTORY_SEPARATOR。
类名(class name)中的每个下划线_都将被转换为一个DIRECTORY_SEPARATOR。
下划线_在空间名(namespace)中没有什么特殊的意义。
完全标准的命名空间(namespace)和类(class)从文件系统加载源文件时将会加上.php后缀。
组织名(vendor name),空间名(namespace),类名(class name)都由大小写字母组合而成。
<?php
/**
* PSR0加载规则
*/
function autoLoad($class_name)
{
// \test\context\class
// 去除字符串前部分ltrim函数中自定的符号,和第二个参数的符号
// 删除字符串前的\符号
$class_name = ltrim($class_name, '\\');
$file_name = ''; // 文件名
$name_space = ''; // 命名空间
// 获得\符号下标准备分割字符串 返回int
// strrpos 从右到左
if ($last = strrpos($class_name, '\\')) {
// 获得命名空间
$name_space = substr($class_name,0,$last);
// 获得类命部分
$class_name = substr($class_name,$last+1);
// 把所有的\转换成/ DIRECTORY_SEPARATOR字符串常量 "/"
$file_name = str_replace('\\',DIRECTORY_SEPARATOR,$name_space).DIRECTORY_SEPARATOR;
}
// 判断class name 是否有 _ 符号 替换成 / 符号 并拼接
$file_name .= str_replace('_',DIRECTORY_SEPARATOR,$class_name).'.php';
echo "filename = ".$file_name.PHP_EOL; // 文件路径
echo 'classname= '.$class_name.PHP_EOL;
echo 'namespace= '.$name_space.PHP_EOL;
// filename = test/context/class/t.php 文件路径
// classname= class_t 类名称
// namespace= test\context 命名空间
require $file_name;
}
spl_autoload_register('autoLoad');
autoLoad('\test\context\class_t');