2

私は現在、Yiiに中途半端に移植されたプロジェクトをリファクタリングしています。コンポーネントフォルダには、PHPの「use」キーワードを使用してコントローラに含まれるクラスがいくつかあります。これにより、「include(protected / components / classes / SClass.php):failed to open stream:No such fileordirectory」エラーが発生します。

それについて本当に奇妙なのは、名前(「use」で使用される)を存在しないファイルに変更すると、致命的なエラーが発生することです。何か案は?

4

2 に答える 2

4

PHPのuseキーワード自体は、他のファイルを含めません。ステートメントで定義された名前空間useが、現在のPHPファイルのさらに下のコードによって参照される可能性があることをPHPに通知するだけです。

ただし、ここで発生する可能性が高いのは、システムにautoload関数が定義されていることです。関数があるautoload場合、PHPは、認識できないクラス名に遭遇するたびにこの関数を呼び出します。このautoload関数は、ロードするクラスファイルを検索し、見つかった場合はそれを含めます。これはおそらくエラーが発生している場所です。

最初のケースでは、これは一連のイベントです。

  • ステートメントはuse有効な名前空間を参照していますが、その名前空間のクラスがコードで参照されるまで、これは無視されます。
  • クラスが参照されると、PHPは「このクラスはまだわかりません。自動ロードします」と言います。
  • オートローダー機能が実行され、含めるパスが作成されます。これは通常、クラスの名前空間とクラス名に由来しますが、autoload関数が期待するように記述されているものであれば何でもかまいません。
  • この場合、オートローダーがパスを構築してそのパスで実行include()しているように見えますが、オートローダーが期待する場所にクラスが存在しません。したがって、「ファイルが見つかりません」エラー。

2番目のケースでは、useステートメントを変更します。

  • ステートメントは別のuse名前空間を参照するようになりましたが、実際にクラスを参照するプログラムの後半でコードを変更していない可能性があります。
  • useプログラムはクラスを呼び出すコードに到達しますが、ステートメントと一致しなくなったため名前空間を認識しないため、即座に致命的なエラーが発生します。
于 2013-01-09T12:06:34.153 に答える
0

ここに記載されているように、ファイルの所有権とアクセス許可を確認し、PHPのセキュリティを確認することをお勧めします。

于 2013-01-09T11:30:31.920 に答える