【问题标题】:PSR-0 Implementation on Class Loading类加载的 PSR-0 实现
【发布时间】:2014-08-05 23:11:29
【问题描述】:

我不是 PHP 新手,但我是 PSR 新手。我已经阅读了其中的一些内容,我想尝试遵循这个编码标准,但我有点困惑如何实现它。因此,我需要你们根据我将提供的示例就如何实现它提出一个简单的建议。

目录结构

 /models
    User.php
 /controller
    controller.php
 /view
    index.php

模型.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 coding-style psr-0 code-standards


    【解决方案1】:

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

    所以如果你在命名空间中定义一个类说:

    <?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();
    

    【讨论】:

    • 嗨。谢谢你。我现在更好地理解它了。所以基本上如果我需要在我的控制器中调用这些类,它仍然是一样的: $var = new User();
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-08
      • 2014-07-25
      • 2014-02-14
      • 2012-10-01
      • 2013-11-09
      • 2014-08-02
      • 2014-12-10
      • 2019-12-22
      • 1970-01-01
      相关资源
      最近更新 更多