PSR-0规范到底是个什么鬼
发布时间
阅读量:
阅读量
文章目录
-
-
-
-
-
- 规范说明
-
- 稍微解释一下
- 实战小demo
- 总结
-
-
-
规范说明
- 严格遵循特定结构命名规范的命名空间和类必须采用格式:< Vendor Name>(< Namespace>)*< Class Name>
- 每个命名空间都应具备一个主命名空间(由Vendor Name提供)
- 每个命名空间都可以拥有多个子命名空间
- 当从文件系统加载时, 每个命名空间中的分隔符(/)需转换为DIRECTORY_SEPARATOR(操作系统路径分隔符)
- 在类名中, 每个下划线()字符需转换为DIRECTORY_SEPARATOR(操作系统路径分隔符). 在命名空间中, 下划线()字符无特殊含义
- 当从文件系统加载时, 合格的名字paces和classes必定具有.php后缀
- 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)
还没有任何评论哟~
