• 第11篇 PSR-0 规范


    Mandatory

    • A fully-qualified namespace and class must have the following structure <Vendor Name>(<Namespace>)*<Class Name>
    • Each namespace must have a top-level namespace ("Vendor Name").
    • Each namespace can have as many sub-namespaces as it wishes.
    • Each namespace separator is converted to a DIRECTORY_SEPARATOR when loading from the file system.
    • Each _ character in the CLASS NAME is converted to a DIRECTORY_SEPARATOR. The _ character has no special meaning in the namespace.
    • The fully-qualified namespace and class is suffixed with .php when loading from the file system.
    • Alphabetic characters in vendor names, namespaces, and class names may be of any combination of lower case and upper case.

    Examples

    • DoctrineCommonIsolatedClassLoader =>/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
    • SymfonyCoreRequest => /path/to/project/lib/vendor/Symfony/Core/Request.php
    • endAcl => /path/to/project/lib/vendor/Zend/Acl.php
    • endMailMessage => /path/to/project/lib/vendor/Zend/Mail/Message.php

    Underscores in Namespaces and Class Names

    • amespacepackageClass_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
    • amespacepackage_nameClass_Name =>/path/to/project/lib/vendor/namespace/package_name/Class/Name.php

    The standards we set here should be the lowest common denominator for painless autoloader interoperability. You can test that you are following these standards by utilizing this sample SplClassLoader implementation which is able to load PHP 5.3 classes.

    这是PHP的第一个规范标准,e文如上,如果e文好的,可以看原创,不好的就听我唠叨唠叨,不对之处,请批评指出,谢谢!主要是制定了一些自动加载标准(Autoloading Standard),很短。这个标准在2014年已经过时,由新的 PSR-4标准替代。但是我们也可以看看嘛,这不影响我们的学习。

    PSR-0强制性要求以下几点:

    1. 一个完全合格的namespace和class必须符合这样的结构:“< Vendor Name>(< Namespace>)*< Class Name>”
    2. 每个namespace必须有一个顶层的namespace("Vendor Name"提供者名字)
    3. 每个namespace可以有多个子namespace
    4. 当从文件系统中加载时,每个namespace的分隔符(/)要转换成 DIRECTORY_SEPARATOR(操作系统路径分隔符)
    5. 在类名中,每个下划线(_)符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线(_)符号是没有(特殊)意义的。
    6. 当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的
    7. verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)

    这里主要讲的是namespace和autoloading。

    第1条

    比如我的文件 /Doctrine/Common/IsolatedClassLoader.php 这样子的一个类文件,那么你的namespace命名就必须声明称这样:

    声明:namespace  DoctrineCommon
    调用:DoctrineCommonIsolatedClassLoader
    

    其中,Doctrine 表示一个模块目录 Vendor name, common就是namesapce, IsolatedClassLoader是class name。这样一看就知道这个文件的目录层次,一目了然。

    再比如:/path/to/project/lib/vendor/Symfony/Core/Request.php 文件:

    声明:namespace SymfonyCore
    调用:SymfonyCoreRequest
    
     

    第2,3条

    namespace endAcl => /path/to/project/lib/vendor/Zend/Acl.php
    namespace endMailMessage => /path/to/project/lib/vendor/Zend/Mail/Message.php
    

    必须有一个顶级的zend的namespace, zend 下面可以有message子命名空间。

     

    第4条

    看这个例子,我们需要new 一个这样的类

    new SymfonyCoreRequest
    

    那么我再加载这个类文件时候,就要将分隔符 转换成 目录,也就是去 Vendor -> Symfony->Core->Request.php 一层层的目录找到这个文件。其实也就是和第1,2,3是反过来的对应关系。

     

    第5条

    第5条是说namespace命名中的这个 _符号 没有任何用处,就是用来表示目录分隔符的,但是注意在PRS-4中已经取消了这个_ ,那么我们还是看一下,这个过时的规定是怎么样的:

    
    amespacepackageClass_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
    
    
    amespacepackage_nameClass_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
    

    以上2个namespace中的_ 其实是目录分隔符。并不是class name就是那样的。现在PSR-4出来后,确实觉得这样的规定有点不好。怪怪的。

     

    第6条

    第6条不用多说。既然你用php,文件名当然是得用.php 后缀结尾。这个规定的原因,我大致猜一下,估计是有人用 .php3 后缀的。好吧。这个是个神话了。因为在apache的配置文件中是允许的:

    <IfModule dir_module>
        DirectoryIndex index.php index.php3 index.html index.htm
    </IfModule>
    

    所以,老老实实的用.php作为后缀名吧。

     

    第7条

    文件大小写的问题,这个其实是很重要的。因为Linux系统下是区分文件名和目录名大小写的,而在Windows下是不区分的。所以就会经常出现问题,比如:

    namespace  DoctrineCommonIsolatedClassLoader
    

    在Linux下就去严格按照大小写去找目录和文件了。但是如果你在windows下开发,全是小写也不会报错,你一发布到Linux上就悲剧了,提示找不到文件。所以,大小写太重要了。

    本博客的所有博文,大都来自自己的工作实践。希望对大家有用,欢迎大家交流和学习。 我的新站:www.huishougo.com
  • 相关阅读:
    调试
    自定义缓冲函数
    缓冲
    如何控制动画
    开发中遇到过的坑
    动画控制属性
    自定义动画
    CATransition(过渡)
    动画基础(显式动画)
    呈现图层
  • 原文地址:https://www.cnblogs.com/zhouqingda/p/5175045.html
Copyright © 2020-2023  润新知