3

さまざまなインクルードファイルの上部に次のコードがあります。

require_once("functions.php");

ページを生成するためにいくつかのインクルードファイルをインクルードする必要がある場合があります。ローカルサーバーでは、上記のコードでfunctions.phpを1回だけインクルードするように指示されているため、これは正常に機能します(したがって、関数を2回宣言しようとはしません)。

本番サーバーにアップロードすると、突然、functions.phpを2回インクルードしようとします。その結果、関数を2回再宣言しようとすると致命的なエラーが発生します。

本番サーバーのphp構成に、require_onceの動作が異なる原因となるものがありますか?

4

7 に答える 7

3

関数.phpという名前のファイルが重複している可能性はありますか?あなたの例は相対的な場所を表していますが、それを2回ロードすることは可能ですか?

echo __FILE__多分それをデバッグするのは関数ファイルの中からでしょう 。

于 2011-06-22T03:58:52.233 に答える
3

次のコードを使用できます。

require_once(realpath(dirname(__FILE__) . '/functions.php'));

ルート内の別のディレクトリにあるfunctions.php場合は、前にパスの場所を変更します。functions.php関数realpath(dirname(FILE)はルートフォルダーのパスを取ります。したがって、関数をindex.phpに含め、function.phpが次のようなディレクトリにあるかどうかを変更する必要があります。

require_once (realpath(dirname(__FILE__) . '/your_directory_name/functions.php'));

楽しみ!!

于 2011-06-22T05:11:44.193 に答える
2

パス設定を確認してください。関数名が共通している場合は、同じ名前の別のファイルが読み込まれている可能性があります。上記の__FILE__値をエコーすることに加えて、一意であることがわかっている名前を付けるか、次のような絶対パスを使用してみてください

require_once dirname(__FILE__).'/functions.php';

于 2011-06-22T04:37:19.593 に答える
1

たぶん、エラー処理レベルは2つのサーバーで異なって設定されていますか?

私が正しく覚えていれば、require_onceは複数回呼び出されたときに単にtrueを返します。

この構成では、いくつかの奇妙な結果が生じる可能性があります。

include_onceを使用して(偽の)ファイルを2回ロードすると、戻り値はtrueになります。

例:

 <?php
  var_dump(include_once 'fakefile.ext'); // bool(false)
  var_dump(include_once 'fakefile.ext'); // bool(true)
 ?>

これは、phpによると、ファイルは(存在していなくても)すでに一度含まれているためです。

これがrequire_onceと同じかどうかはわかりませんが、この構成の予想される動作については、ドキュメントでinclude_onceが参照されているためである可能性があります。

于 2011-06-22T03:46:23.903 に答える
1

大文字と小文字を区別しないファイルシステムでは、require_once言語構造は、パスの大文字と小文字に関係なく、同じファイルを指します。ただし、これが問題です。大文字と小文字が異なるバリアントは同じファイルを指していますが、ファイルがすでに含まれているかどうかを確認するためにチェックが行われると、それらは同じファイルとして扱われません。

require_once __DIR__.'/address/src/Coordinates.php';
require_once __DIR__.'/Address/src/Coordinates.php';

上記の例では、大文字と小文字を区別しないファイルシステムでは、両方の行で同じファイルが必要になります。パスの大文字と小文字が異なるため、2番目のファイルは成功します。

必要なファイルにさらにrequire_once言語構造がある場合、つまり、相対パスと組み合わせてマルチレベルのrequiresを実行している場合、これはさらに悪化します。このようなシナリオでは、ネストされた相対パスは、より高いレベルで使用される大文字化を使用してフルパスに解決されます。このネストされた構造のどこかで別の大文字を使用すると、同じ問題が発生します。

var_dump(get_included_files());

これにより、含まれているファイルのリストと、使用したフルパスおよび正確な大文字と小文字が表示されます。これは、コルプリットをすばやく見つけるのに役立ちます。

于 2018-08-28T12:21:53.703 に答える
0

私は正直なところ、この動作を引き起こすものは何も考えられません。サイトがどのように構成されているかを少し知っていれば、これが起こらないように別の方法で構成する方法についていくつか提案できます。

私が自分のサイトで行っていることは、この種の設定です。

global.php <-ランダムな関数を持つファイルを含む、データベースの構成など

header.php <-基本的なhtmlヘッダーのもの、global.phpはrequired_onceここにあります。

次に、他のすべてのファイルで、ヘッダーファイルが必要なだけで、競合が発生しないはずです。特定のフレームワーク(CakePHP、Kohana)を使用している場合、これは間違いなく状況を変えます...私が言ったように、すぐに進むには十分な情報がありません。

于 2011-06-22T03:43:03.917 に答える
0

クラスを含むファイルをインクルードする場合は、を使用してみてください__autoload。これにより、複数のインクルード/リクワイアが実行されなくなり、多数のインクルード/リクワイアがリストされなくなります。

于 2011-06-22T03:53:24.153 に答える