2

まず、次の SplClassLoader を使用して手を試しています - https://gist.github.com/221634

これが私のファイル構造です:

/root/f1/f2/APS/Common/Group.php
/root/f1/f2/index.php
/root/f1/f2/SplClassLoader.php

これが Group (Group.php) という私のテストクラスです

namespace APS\Common;

class Group{
...
}

すべてを呼び出している index.php ファイルは次のとおりです。

require "SplClassLoader.php";
$classLoader = new SplClassLoader('APS', 'APS/Common');
$classLoader->register();

次のエラーが表示されます。

Fatal error: Class 'Group' not found in /root/f1/f2/index.php on line 17

名前空間とパスをローダーに渡すときに、考えられるすべての組み合わせを試しました。それは決して機能しません。

更新 #1 - index.php の 17 行目:

16: use APS\Common;
17: $x = new Group();

更新 #2 - 構成情報

  • アパッチ/2.2.15 (レッドハット)
  • PHP 5.3.3

更新 #3 - 別のエラー メッセージが表示されます。

適切なコード:

require "SplClassLoader.php";
$classLoader = new SplClassLoader('APS', '/root/f1/f2');
$classLoader->register();

use APS\Common;
$x = new Common\Group();

私が得ているエラーメッセージ:

Warning: require(/f1/f2/APS/Common/Group.php): failed to open stream: No such file or directory in /root/f1/f2/SplClassLoader.php on line 133 
4

2 に答える 2

0

私の場合、これがうまくいくと思われる解決策です。

require "SplClassLoader.php";
$classLoader = new SplClassLoader('APS\Common', __DIR__);
$classLoader->register();

use APS\Common;
$x = new Common\Group();

それを機能させるには、魔法の定数DIRを使用する必要がありました。2 番目のパラメーターは、クラスが存在するルートの物理パスを指す必要があるようです。次に、名前空間が追加され、ファイル システム内でそれらを見つけます。

于 2013-01-30T14:27:34.723 に答える
0

このステートメントを使用する場合use(しゃれた意図はありません)、使用する名前空間またはクラスのエイリアスを作成するだけです。PHP マニュアルによると、use \Foo\Bar;は と同等use \Foo\Bar as Bar;です。

したがって、あなたの場合、APS\Commonエイリアスを使用して名前空間をインポートしますCommonGroupこれは、このネームスペース内のクラスをCommon\Groupではなくとして参照できることを意味しますAPS\Common\Group。名前空間エイリアスを使用しない場合 (あなたが行ったように)、クラスローダはクラスがGroupグローバル名前空間にあることを期待します (そして、クラスが に格納されることを期待します/root/f1/f2/Group.php)。

編集:別の可能性は、単にnamespace \APS\Common;ファイルに入れることです。名前空間を指定せずに (つまり、またはGroupの代わりに) クラスを参照すると、PHP はそのクラスが現在の名前空間にあると想定します。\Group\APS\Common

于 2013-01-29T21:00:37.340 に答える