-3

PHP (>5.4.*) と composer の名前空間について非常に混乱しています。

シナリオ

|vendor
   |autoload.php
    |abkrim
       |cputils
          |src
             |CpPanelBackTest.php

コード CpPanelBackTest.php

namespace Abkrim\Cputils;
class CpPanelBackTest
{
    public static function getDate(){
      $year = date('Y');
      $month = date('m');
      $day = date('d');
      return $day . '/' . $month . '/' . $year;
    }
}

ファイル test.php

require __DIR__.'/../../vendor/autoload.php';
use Abkrim\Cputils\CpPanelBackTest;
echo 'Date today is: ' . CpPanelBackTest::getDate();

vendor/abkrim/cputils の composer.json ファイル

"autoload": {
   "psr-4": {
      "Abkrim\\Cputils\\": "src/"
   }
}

エラーを取得 ->

PHP Fatal error:  Class 'CpPanelBackTest' not found in at file xxxx line xxxx

CpPanelBackTest.php のコードを変更した場合

//namespace Abkrim\Cputils; //coment namespace
class CpPanelBackTest
{
    public static function getDate(){
      $year = date('Y');
      $month = date('m');
      $day = date('d');
      return $day . '/' . $month . '/' . $year;
    }
}

そしてファイルtest.php

//require __DIR__.'/../../vendor/autoload.php';
//use Abkrim\Cputils\CpPanelBackTest;
require_once __DIR__ . '/../../vendor/abkrim/cputils/src/CpPanelBackTest.php';

今はうまくいきます。

道に迷いました。私はそれについて何も理解していません echo 'Date today is: ' . CpPanelBackTest::getDate();

4

1 に答える 1

1

発生しているエラーは、PHP がクラスをロードまたは検出できないときにトリガーされます。そのエラー メッセージの名前は、検索されているクラスの完全修飾名です。

エラー メッセージのその名前には名前空間が含まれていません。つまり、名前空間を使用しているとは検出されませんでした。echo 'Date today is: ' . CpPanelBackTest::getDate();No namespace hereという 1 行を見れば、どちらが正しいのでしょう。

その前にステートメントがありuse、クラスを現在の (グローバル) 名前空間にインポートすることになっています。そして、それができると信じています-私のテストでは、質問に投稿されたコードがおそらく正しく機能することが示されています。問題は、Composer などを含む別のパッケージでテスト ケース全体を作成するのは難しいと思うので、ファイル システムの違いを考慮しない小さな置換テストのみを実行したことです。

<?php

namespace Foo {
class Bar {}
}

namespace {
use Foo\Bar;
var_dump(new Bar);
}

実際に見てみましょう: http://3v4l.org/mrVsI

そして、これは私の推測です: PHP クラスは大文字と小文字を区別しませんが、クラス名からパスとファイル名への変換は、一部のファイルシステムでは大文字と小文字を区別します。コード内の 1 文字だけを間違えた場合、Composer はプレフィックスを検出できず、正しいファイルを見つけることができません。

残念ながら、オートロードが間違っていることを証明する正しいテストを行っていません。名前空間を無効にすることなく、オートローダーのみを削除し、代わりにクラスを含むファイルを要求する必要があります。

于 2015-06-18T18:38:00.657 に答える