12

PHP 5.3 の名前空間について学んでおり、名前空間の自動読み込みを使用したいと考えています。このSplClassLoader クラスを見つけましたが、その仕組みがわかりません。

次のようなディレクトリ構造があるとします。

system
  - framework
    - http
      - request.php
      - response.php
index.php
SplClassLoader.php

クラスのオートローディングを有効にするにはどうすればよいですか? どのような名前空間が必要request.phpで、持つべきresponse.phpか?

これは次のrequest.phpとおりです。

namespace framework\http;

class Request
{
    public function __construct()
    {
        echo __CLASS__ . " constructer!";
    }
} 

そして、これは次のresponse.phpとおりです。

namespace framework\http;

class Request
{            
    public function __construct()
    {      
        echo __CLASS__ . " constructed!";                
    }           
}   

そしてindex.php私は持っています:

require_once("SplClassLoader.php");
$loader = new SplClassLoader('framework\http', 'system/framework');
$loader->register();

$r = new Request();

次のエラー メッセージが表示されます。

Fatal error: Class 'Request' not found in C:\wamp\apache\htdocs\php_autoloading\index.php on line 8

なぜこれが機能しないのですか?クラスをロード/要求するようにプロジェクトで使用するSplClassLoaderにはどうすればよいですか? また、フォルダーと名前空間をどのようにセットアップして名前を付ける必要がありますか?

4

1 に答える 1

11

次の例のように、ファイル名とディレクトリ名は、クラスと名前空間の大文字と小文字を正確に一致させる必要があります。

system
  - framework
    - http
      - Request.php
      - Response.php
index.php
SplClassLoader.php

さらに、次のように、SplClassLoader オブジェクトを登録するときにルート名前空間を宣言するだけで済みます。

<?php

    require_once("SplClassLoader.php");
    $loader = new SplClassLoader('framework', 'system/framework');
    $loader->register();

    use framework\http\Request;

    $r = new Request();

?>

お役に立てれば!

于 2012-05-24T04:02:04.473 に答える