2

私は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;
   }

しかし、それらのコードをどこにどのように配置するかはわかりません。

ありがとう!

4

2 に答える 2

1

これは、使用している名前空間ごとにフォルダーがあることを意味します。

したがって、名前空間でクラスを定義する場合は、次のように言います。

<?php
namespace Nicemodels;

class Niceuser { ... }

次に、Niceuser.php ファイルを .../models/Nicemodels/ に配置する必要があります。

models ディレクトリを正しく処理していることを確認する必要があります。より高いレベルで 1 つを開始し、すべてのモデルを 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/ フォルダーを開始点として指定する必要があります。また、ファイル名の最初の大文字と小文字を区別する必要があります。そうしないと、オートローダーはクラスを見つけられません。


コントローラーでそのようなクラスを使用する場合は、次のようにします。

$user = new \Models\Nicemodels\Niceuser();

クラスをインポートすると、それを短縮できます。

use Models\Nicemodels\Niceuser;
...
$user = new Niceuser();
于 2014-06-16T07:26:53.970 に答える
0

オートローダーを spl_autoload_register() 関数で登録する必要があります。

ドキュメントにいくつかの良い例があります: http://www.php.net/manual/en/function.spl-autoload-register.php

于 2014-06-16T07:38:57.870 に答える