PSR-0在类加载上的实现

时间:2014-06-16 07:18:32

标签: php coding-style psr-0 code-standards

我不是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;
   }

但我不知道如何以及在何处放置这些代码。

谢谢!

2 个答案:

答案 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