繁体   English   中英

PSR-0在类加载上的实现

[英]PSR-0 Implementation on Class Loading

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

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

谢谢!

这意味着您为所使用的每个命名空间都有一个文件夹。

因此,如果您在名称空间中定义一个类,请说:

<?php
namespace Nicemodels;

class Niceuser { ... }

然后,文件Niceuser.php需要位于... / models / Nicemodels /

您仍然需要确保正确处理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;

在这里,您将名称空间分隔符“ \\”转换为目录分隔符。

您需要告诉自动加载所有这些内容的起点。 因此,如果您不使用Models名称空间,则需要将其作为开始指向模型/文件夹。 并且您需要确保以这种方式开始文件名。 否则,自动加载器将找不到您的类。


如果要在控制器中使用此类,请执行以下操作:

$user = new \Models\Nicemodels\Niceuser();

如果导入该类,则可以缩短该时间:

use Models\Nicemodels\Niceuser;
...
$user = new Niceuser();

您需要使用spl_autoload_register()函数注册自动加载器。

您在文档中有一些不错的示例: http : //www.php.net/manual/en/function.spl-autoload-register.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM