Advertisement

PSR-0规范到底是个什么鬼

阅读量:

官网地址
社区翻译

文章目录

            • 规范说明
        • 稍微解释一下
        • 实战小demo
        • 总结
规范说明
  1. 严格遵循特定结构命名规范的命名空间和类必须采用格式:< Vendor Name>(< Namespace>)*< Class Name>
  2. 每个命名空间都应具备一个主命名空间(由Vendor Name提供)
  3. 每个命名空间都可以拥有多个子命名空间
  4. 当从文件系统加载时, 每个命名空间中的分隔符(/)需转换为DIRECTORY_SEPARATOR(操作系统路径分隔符)
  5. 在类名中, 每个下划线()字符需转换为DIRECTORY_SEPARATOR(操作系统路径分隔符). 在命名空间中, 下划线()字符无特殊含义
  6. 当从文件系统加载时, 合格的名字paces和classes必定具有.php后缀
  7. Verdor name,namespaces,class名都可以由大小写字母组成(大小写敏感)
稍微解释一下
  • 第一条
    例如 这个文件下的类 /Doctrine/Common/IsolatedClassLoader.php
    /path/to/project/lib/vendor/Symfony/Core/Request.php
复制代码
    声明:namespace  \Doctrine\Common\
    调用:\Doctrine\Common\IsolatedClassLoader
    
    声明:namespace \Symfony\Core
    调用:\Symfony\Core\Request

其中,Doctrine代表一个模块目录结构 Vendor name, common即代表namesapce, IsolatedClassLoader即是class name。

  • 第二、三条
复制代码
    namespace \Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
    namespace \Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php

必须创建一个顶级Zend命名空间,并且在该命名空间下还可以包含message子命名空间

  • 第四条
    我们需要new 一个这样的类
复制代码
    new \Symfony\Core\Request

那么当我加载该类文件时,就需要将分隔符\转换为目录结构,并前往Vendor -> Symfony->Core->Request.php这一系列路径来找到所需的文件.

  • 第五条
复制代码
    \namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
    \namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
实战小demo

目录结构如下:

  • 入口文件:

D:\www\mvc\public\index.php
这个文件中实现了自动加载

复制代码
    <?php
    
    function autoload($className)
    {
    $className = ltrim($className, '\ ');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\ ')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\ ', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    require dirname(dirname(__FILE__)).'\ '.$fileName;
    }
    
    spl_autoload_register('autoload');
    
    //调试1
    $Obj1 = new app\controllers\HomeController;
    var_dump($Obj1);
    
    //调试2
    echo "</br>";
    $Obj2 = new app\controllers\Index_Cat;
    var_dump($Obj2);
  • 调用结果

在入口中我们调用了两个示例

复制代码
    //调试1
    $Obj1 = new app\controllers\HomeController;
    var_dump($Obj1);
    
    //调试2
    echo "</br>";
    $Obj2 = new app\controllers\Index_Cat;
    var_dump($Obj2);
  • 这两个类分别为

D:\www\mvc\app\controllers\HomeController.php

复制代码
    <?php
    /** * Created by PhpStorm.
     * User: liang
     * Date: 2020/6/3
     * Time: 16:30
     */
    
    namespace app\controllers;
    
    class HomeController
    {
    public function home()
    {
     
    }
    }

D:\www\mvc\app\controllers\Index\Cat.php

复制代码
    <?php
    /** * Created by PhpStorm.
     * User: liang
     * Date: 2020/6/26
     * Time: 15:45
     */
    namespace app\controllers;
    
    class Index_Cat
    {
    
    }
总结

1、命名空间与路径一致
2、类的下划线会分隔成目录

全部评论 (0)

还没有任何评论哟~