我对PHP并不陌生,但我对PSR并不陌生。我读过其中的一些,我想尝试在编码方面遵循这个标准,但我有点困惑如何实现它。因此,我需要一个简单的建议,从你们如何实现的基础上,我将提供的例子。
目录结构
/models
User.php
/controller
controller.php
/view
index.phpModel.php
Class User
{
public function foo()
{
// Do something
}
}我如何用PSR-0方法在我的controller.php上调用这个类?我读过这样的书
namespace, use还有这个
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;
}但我不知道该怎么把这些密码放哪儿。
谢谢!
发布于 2014-06-16 07:26:53
这意味着您为所使用的每个名称空间都有一个文件夹。
因此,如果您在名称空间中定义了一个类,请说:
<?php
namespace Nicemodels;
class Niceuser { ... }然后文件Niceuser.php需要在./model/Nicemodels/
您仍然需要确保正确处理模型目录。您可以在更高的级别启动一个模型,并将所有模型放在模型命名空间中(推荐)。
因此,上面的例子如下:
<?php
namespace Models\Nicemodels;
class Niceuser { ... }use语句用于从另一个命名空间导入类:
<?php
namespace Models\Nicemodels;
use Models\Normaluser
class Niceuser extends Normaluser { ... }自动加载器将此命名空间映射到行中的目录行为。
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;在这里,您可以将命名空间分隔符“\”转换为目录分隔符。
你需要告诉你的自言自语这一切的起点。因此,如果不使用模型名称空间,则需要将模型/文件夹作为开始。你需要确保你开始你的文件名的情况。否则,自动加载器将找不到您的类。
如果要在控制器中使用此类,请执行以下操作:
$user = new \Models\Nicemodels\Niceuser();如果您导入类,您可以缩短它:
use Models\Nicemodels\Niceuser;
...
$user = new Niceuser();发布于 2014-06-16 07:38:57
您需要使用spl_autoload_register()函数注册自动加载程序。
在docs中有一些很好的例子:http://www.php.net/manual/en/function.spl-autoload-register.php
https://stackoverflow.com/questions/24238408
复制相似问题