私はこの名前空間のことで新しいです。
ベースディレクトリに2つのクラス(個別のファイル)があります。たとえば、ディレクトリclass1.php
内にclass2.php
とsrc/
があります。
class1.php
namespace \src\utility\Timer;
class Timer{
public static function somefunction(){
}
}
class2.php
namespace \src\utility\Verification;
use Timer;
class Verification{
Timer::somefunction();
}
class2.php
を実行すると、致命的なエラーが発生します。
PHPの致命的なエラー:クラス 'タイマー'がpath/to /class2.phpの行***に見つかりません
SOのどこかで、このためのオートローダーを作成する必要があることを読みました。もしそうなら、私はそれを作成するためにどのようにアプローチしますか、そうでない場合、他に何が問題ですか?
[〜#〜] update [〜#〜]
Phpスクリプトの上に必要なすべてのファイルをrequire
するオートローダーを作成しました。したがって、class2.phpは次のようになります。
namespace \src\utility\Verification;
require '/path/to/class1.php'
use Timer;
//or use src\utility\Timer ... both doesn't work.
class Verification{
Timer::somefunction();
}
これも機能せず、クラスが見つからないことを示しています。しかし、すべてのnamespaces
とuse
を削除すると。すべてが正常に動作します。
名前空間の問題は2つの方法で解決できます
2)Composerを使用して、自動読み込みを操作できます!
最初の方法(名前空間とrequire)の方法
Class1.php(タイマークラス)
namespace Utility;
class Timer
{
public static function {}
}
Class2.php(検証クラス)
namespace Utility;
require "Class1.php";
//Some interesting points to note down!
//We are not using the keyword "use"
//We need to use the same namespace which is "Utility"
//Therefore, both Class1.php and Class2.php has "namespace Utility"
//Require is usually the file path!
//We do not mention the class name in the require " ";
//What if the Class1.php file is in another folder?
//Ex:"src/utility/Stopwatch/Class1.php"
//Then the require will be "Stopwatch/Class1.php"
//Your namespace would be still "namespace Utility;" for Class1.php
class Verification
{
Timer::somefunction();
}
2番目の方法(Composerと自動読み込み方法を使用)
composer.jsonファイルを作成します。あなたの例「src/Utility」によると、srcフォルダーの前にcomposer.jsonファイルを作成する必要があります。例:myAppというフォルダーには、composer.jsonファイルとsrcフォルダーがあります。
{
"autoload": {
"psr-4": {
"Utility\\":"src/utility/"
}
}
}
次に、そのフォルダーに移動し、composer.jsonファイルがあるフォルダーの場所でターミナルを開きます。ターミナルに入力してください!
composer dump-autoload
これにより、ベンダーフォルダが作成されます。したがって、「MyApp」という名前のフォルダーがある場合は、ベンダーフォルダー、srcフォルダー、およびcomposer.jsonファイルが表示されます。
Timer.php(タイマークラス)
namespace Utility;
class Timer
{
public static function somefunction(){}
}
Verification.php(検証クラス)
namespace Utility;
require "../../vendor/autoload.php";
use Utility\Timer;
class Verification
{
Timer::somefunction();
}
複雑なフォルダ構造の場合、この方法はより強力です!!
SOですでに読んでいるので、オートローダーを実装する必要があります。
自動読み込みの標準PSR-4は http://www.php-fig.org/psr/psr-4/ で確認でき、PSR-4自動読み込みのサンプル実装と例を見ることができます。ここで複数の名前空間を処理するためのクラスの実装 https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md 。