web-dev-qa-db-ja.com

PHP名前空間の使用時にクラスが見つかりません

私はこの名前空間のことで新しいです。

ベースディレクトリに2つのクラス(個別のファイル)があります。たとえば、ディレクトリclass1.php内にclass2.phpsrc/があります。

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();
}

これも機能せず、クラスが見つからないことを示しています。しかし、すべてのnamespacesuseを削除すると。すべてが正常に動作します。

7

名前空間の問題は2つの方法で解決できます

1)名前空間を使用してrequire

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(); 
  }

複雑なフォルダ構造の場合、この方法はより強力です!!

13
Photon Khan

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

1
Andreas