我正在做一个类似于CodeIgniter的框架,但有名称空间。我不想使用runkit,因为许多主机提供商没有扩展。
命名空间是基于到文件类的路径,如果我也加载了文件类,我知道命名空间有这个类,但是我不知道用什么方法来声明命名空间。
我为我的英语道歉。我将试着用一个例子来解释我:namespace 'FlexIgniter'Core
class Load {
public function loadClass($name, $ns) {
runkit_constant_redefine("NAMESPACE_AUTO", $ns);
$path = $this->class2path($class);
include_once($path);
}
}
要加载的文件:
namespace NAMESPACE_AUTO;
class ToLoad {
// do some stuff...
}
谢谢。
PS: https://github.com/Localnet/FlexIgniter
以下是PSR-0的要求:
以下描述了必须遵守的强制性要求为自动装填机互操作性。
- 一个完全限定的命名空间和类必须具备以下条件结构
'<Vendor Name>'(<Namespace>')*<Class Name>
- 每个命名空间必须有一个顶级命名空间("供应商名称")。
- 每个命名空间可以有任意多的子命名空间。
- 每个命名空间分隔符被转换为
DIRECTORY_SEPARATOR
- CLASS NAME中的每个
_
字符都转换为DIRECTORY_SEPARATOR
。_
字符在文本中没有特殊含义名称空间。
- 完全限定的命名空间和类以
.php
作为后缀
- 供应商名、命名空间和类名中的字母字符可以
例子-
'Doctrine'Common'IsolatedClassLoader
=> /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
-
'Symfony'Core'Request
=> /path/to/project/lib/vendor/Symfony/Core/Request.php
-
'Zend'Acl
=> /path/to/project/lib/vendor/Zend/Acl.php
-
'Zend'Mail'Message
=> /path/to/project/lib/vendor/Zend/Mail/Message.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
'<Vendor Name>'(<Namespace>')*<Class Name>
DIRECTORY_SEPARATOR
_
字符都转换为DIRECTORY_SEPARATOR
。_
字符在文本中没有特殊含义名称空间。.php
作为后缀'Doctrine'Common'IsolatedClassLoader
=> /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
'Symfony'Core'Request
=> /path/to/project/lib/vendor/Symfony/Core/Request.php
'Zend'Acl
=> /path/to/project/lib/vendor/Zend/Acl.php
'Zend'Mail'Message
=> /path/to/project/lib/vendor/Zend/Mail/Message.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
我们在这里设定的标准应该是最小公分母无痛自动装填机互操作性。你可以测试一下通过使用这个样例SplClassLoader遵循这些标准
示例实现
下面是一个示例函数,简单地演示了如何上面建议的标准自动加载。
<?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 $fileName;
}
SplClassLoader实现下面的要点是一个示例SplClassLoader实现,它可以如果遵循自动加载器互操作性,则加载类上述提出的标准。这是当前推荐的加载PHP的方式5.3遵循这些标准的类。
- http://gist.github.com/221634