我不是PHP的新手,但我是PSR的新手。我已经阅读了其中的一些内容,我想尝试遵循这些编码标准,但我有点困惑如何实现它。所以我需要一些关于如何根据我将提供的示例实现它的建议。
目录结构
/models
User.php
/controller
controller.php
/view
index.php
Model.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;
}
但我不知道如何以及在何处放置这些代码。
谢谢!
答案 0 :(得分:1)
这意味着您正在使用的每个命名空间都有一个文件夹。
因此,如果您在命名空间中定义一个类,请说:
<?php
namespace Nicemodels;
class Niceuser { ... }
然后文件Niceuser.php需要在... / models / Nicemodels /
中您仍需要确保正确处理models目录。您可以在更高级别启动一个并将所有模型放在Models命名空间中(推荐)。
所以上面的例子变成了:
<?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;
在这里转换命名空间分隔符&#39; \&#39;进入目录分隔符。
你需要告诉你的自动加载这一切的起点。因此,如果您不使用Models命名空间,则需要指向您的模型/文件夹作为开始。而且你需要确定你用文件名启动的情况。否则自动装带器将找不到您的课程。
如果你想在控制器中使用这样的类,你可以:
$user = new \Models\Nicemodels\Niceuser();
如果您导入课程,可以缩短它:
use Models\Nicemodels\Niceuser;
...
$user = new Niceuser();
答案 1 :(得分:0)
您需要使用spl_autoload_register()函数注册自动加载器。
您在文档中有一些很好的例子:http://www.php.net/manual/en/function.spl-autoload-register.php