2014-06-16 112 views
2

我不是PHP的新手,但我是PSR的新手。我已經閱讀了一些,我想嘗試遵循這個編碼標準,但我有點困惑如何實現它。所以我需要一個關於如何基於我提供的示例實現它的簡單建議。PSR-0類加載實現

目錄結構

/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; 
    } 

但我不知道在何處以及如何把這些代碼。

謝謝!

回答

1

這意味着你有一個用於你正在使用的每個名字空間的文件夾。

所以,如果你在一個命名空間中定義一個類,說:

<?php 
namespace Nicemodels; 

class Niceuser { ... } 

然後Niceuser.php需要的文件是在... /模型/ Nicemodels/

您仍然需要確保您正確處理模型目錄。您可以從更高級別開始,並將所有模型放入模型名稱空間(推薦)。

所以上面的例子就變成:

<?php 
namespace Models\Nicemodels; 

class Niceuser { ... } 

使用語句用來從另一個命名空間導入類:

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

嗨。謝謝。我現在更瞭解它。所以基本上,如果我需要在我的控制器中調用這些類,它將仍然是相同的: $ var = new User(); – user3651491

+0

我已經更新了我的答案以證明這一點。 – colburton