PHP PSR0规则 自动加载

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

猜你喜欢

转载自my.oschina.net/u/3529405/blog/1825132
今日推荐