一个彻底标准的命名空间(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');