簡體   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