我正在做一个类似于CodeIgniter的框架,但是使用了名称空间。我不想使用runkit,因为许多托管提供商都没有这个扩展。
命名空间是基于file类的路径的,如果我也加载了file类,我知道命名空间有这个类,但我不知道用什么sintax来声明命名空间。
我为我的英语道歉。我会试着用一个例子来解释一下:
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...
}谢谢。
发布于 2013-01-11 02:24:33
Here are the requirements for PSR-0
下面描述了自动加载机互操作性必须遵守的强制性要求。
必填
\<Vendor Name>\(<Namespace>\)*<Class Name>DIRECTORY_SEPARATOR。DIRECTORY_SEPARATOR。从文件加载供应商名称、命名空间和类名中的system._字符在namespace..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=> =>
我们在这里设置的标准应该是无痛自动加载器互操作性的最低公分母。您可以使用这个能够加载PHP5.3类的样例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实现,如果您遵循上面提出的自动加载器互操作性标准,它可以加载您的类。这是当前推荐的加载符合这些标准的PHP5.3类的方法。
https://stackoverflow.com/questions/14264689
复制相似问题