3

PHP のinclude構文をどのように解釈するか、たとえば、テキストが含まれているかどうか、いつ評価されるかなどを調べようとしています。いつものように、ドキュメントはかなり非公式で曖昧です。

実験に基づくと、それはシンタックス シュガーのようです。具体的には、コンストラクト

include 'Baz.php'

に置き換えることができる式です。

eval('?>' . file_get_contents('Baz.php',  FILE_USE_INCLUDE_PATH))

これは正しいです?この置換は一般的な場合に当てはまりますか、それとも私のテストでのみ当てはまりますか?

編集: bwoebi が指摘しているように、uatedevalコードには同じ定数__DIR____FILE__魔法の定数がないため、これは一般的に正しくありません。それらを設定する方法があれば、それもモデル化できます。

編集 2: この質問は、この質問の複製です: eval を使用した include と同等です。ただし、そこにあるすべての回答は、ファイルパスのコンテキストに関するbwoebiのポイントを省略しているようです。

4

2 に答える 2

2

はい、それは一般的に正しいはずです。

唯一の違いは次のとおりです。

  • ファイル コンテキスト (現在eval()'ed codeは、そのファイルのコードではありません)
  • 相対パス: 他のディレクトリにファイルを含め、それらが相対パスを使用する場合、それが指すファイルが見つからなくなる可能性があります
  • file_get_contents()allow_url_includeini 設定の影響を受けません(ただしallow_url_fopen、両方に影響します)
于 2014-05-15T14:46:43.277 に答える
0

その他の注意事項は次のとおりです。

  • これにより、ファイルの内容がテキストとしてメモリに読み込まれ、解析/評価されるため、PHP オペコード キャッシングが中断され、予期しない場合にパフォーマンスが大幅に低下します。この質問で述べたように。
  • コードの解析エラーは、スクリプトの残りの部分にとって致命的ではありません。これにより、発生すると予想されるロジックが実行されない場合でも、スクリプトの実行を続行できるという副作用があります。(これは、他のタイプのエラーにも当てはまる場合があります)。
  • エラー報告は正しいファイル/行に解決されないため、デバッグが困難になります。
  • _onceこれは、厳密に 1 回だけファイルを含める/要求することを許可する構造をサポートしません。これは、重複したクラス/関数宣言が致命的であるか、予期しない動作をすることを意味します。

これをお勧めできない他の考慮事項があると確信しています。必要な機能や、これを行う必要がある理由を知らなければ、役に立つ答えを出すことは困難です。

利用することの最良の部分evalは、エラーからの回復です (これを「最良」と呼ぶことができる場合)。それがあなたが利用しようとしている利点である場合、しかし、この種の唯一の選択肢です....残念ながら...

于 2014-05-15T15:32:44.260 に答える