4

今日、名前空間とオートロードの使い方を学んでいますPHPが、障害にぶつかったようです。spl_autoload_registerbut 代わりにを使用しないとうまくいくようですrequire_once

私のフォルダ構造は最小限です:

- index.php
- class/
  - Users.php

私のindex.phpファイルには次のものがあります。

<?php
require_once('class/Users.php');

echo User::get(1);

私のclass/Users.phpファイルには次のものがあります。

<?php

Class User {
    function get($id) {
        return $id;
    }
}

これはまったく問題なく動作し、のIDを返します1

理想的には、オートロード機能を使用したいと思います。spl_autoload_*これが私がやろうとしたことですが、成功しませんでした:

私のclass/Users.phpファイルには次のものがあります。

<?php
namespace Users; // Added a namespace

Class User {
    function get($id) {
        return $id;
    }
}

私のindex.phpファイルには次のものがあります。

<?php
// Changed to using spl_autoload_register using an anonymous function to load the class 
spl_autoload_register(function($class){
    include('class/' . $class . '.php');
});

echo Users\User::get(1); // Added the Users namespace

しかし、私はエラーが発生します:

`Class 'Users\User' not found in /Applications/MAMP/htdocs/index.php on line 7`

何が間違っているのかよくわかりません。

4

2 に答える 2

1

名前空間パスの前に \ を追加する必要があると思います。

\Users\User::get(1);

Traversable() のようなベース パスを使用する必要がある場合は、次のことも行う必要があります。

new \Traversable()
于 2012-09-06T11:06:33.987 に答える
1

オートローダーは、名前空間を含む完全なクラス名を引数として呼び出されます。あなたの例では、これはUsers\Userであるため、最終的には

include('class/Users\User.php');

クラス定義がという名前のディレクトリにないため、これは失敗しますUsers(ちなみに、include展開されたファイル名を含むファイルが見つからないという警告が表示されます。この警告により、問題が明確になります-エラーレポートを無効にしていますか?)

ファイルが見つからない場合は、その場でオートローダーを失敗させて、失敗モードをより明確にすることをお勧めします。たとえば、次のように変更できます

require('class/' . $class . '.php'); // require will end the script if file not found

または何かに

$result = @include('class/' . $class . '.php'); // see documentation for include
if ($result === false) {
    die("Could not include: 'class/$class.php'");
}
于 2012-09-06T11:10:29.553 に答える