类加载的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目录。您可以在更高的级别上启动一个,并将所有模型放在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命名空间,你需要指向你的Models/文件夹作为start。你需要确保文件名的开头是大小写。否则自动加载器将找不到你的类。


如果你想在你的控制器中使用这样的类,你可以这样做:

$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