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