2012-01-15 5 views
14

フレームワークとコードをダウンロードしました。requireincludeと対class_existsという質問があります。私がダウンロードしたコードで クラスが必要であり、理解しています

は、私は以下を参照してください。

require_once('class.php'); 

と同様に:

if(class_exists('class') == false) { require('class.php'); } 

私が手require_onceのみ1時間を意味し、クラスがクラスが存在するかどうかを確認存在しますが。

私の質問です:最初のものよりも2番目の方が良いですか?なぜ?

+0

実際には非常に興味深い見通しです。私は前に2度目の使用法を見たことがないことに驚いています。 – esqew

+1

言いたいことは、今日はもっと良い方法があるということです。http://php.net/spl-autoload-register – KingCrunch

+2

私はここで各ファイルが唯一のクラスを表していると推測していますか?ファイルごとに複数のクラスがありませんか? –

答えて

9

この条件:

if(class_exists('class') == false) { require('class.php'); } 

呼ばれるrequire_onceを防ぎます。彼らは、ファイルが2回以上含まれていないことを確認するためのコードをスキャンする必要があるため、あなたはあなたのプロジェクト(特別なフレームワーク)に含めるファイルの多くを持っている場合

require_onceが遅くなることがあります。したがって、25個を超えるファイルが含まれていて、それらがネストされている場合、require_onceはそれらすべてをチェックする必要があります。

1

2番目のクラスは、クラスを2回インポートすることからより多くの保護を提供します。最初のクラスはクラスファイルを一度インポートしますが、何らかの理由で別のファイルからクラスをインポートした場合は、そのクラスが既に宣言されていてクラスファイルは必要ないと判断します。

+0

注:同じ名前の2つのクラスはほとんど常に悪い考えです。何か狂ったことをしない限り、 'require_once'はうまくいくはずです。 –

1
  • require_once()だけincludeは一度ファイルね。

  • class_exists()は、クラスが存在するかどうかを確認します。

複数のファイルにクラスを定義でき、require_once()は気にしません。 2番目のチャンクが作成されます。

5

他の回答で説明したように、2つの変種の間に意味の違いがあります。また、ホスティングプロバイダがPHPオペコードキャッシング(APCまたはequiv)を提供していない共有ホスティングシナリオでは、すべてのコードファイルを読み込み、に一度読み込んでコンパイルする必要があります()。ここでは、主なキラーはコンパイル時間そのもの(現代のコアでは約0.5MのPHP文/秒)ではなく、ファイルシステムのキャッシュにプリキャッシュされていない場合にPHPファイルを収集するI/Oオーバーヘッドです/ Os/sec)。

このシナリオでは、アプリケーションが90%のクエリのコアモジュールを必要とする場合、これらのバンドルを1つのバルクロードファイルにキャッシュするのが理にかなっています。この種の解決法が採用された場合には、クラスファイルの要求の周りにclass_exists('class')ガードを置くことで、防爆になります。

また注意:あなたはJITのクラスのロードを行うための__autoload()機能を使用する場合は、class_exists('fred')fredの自動ロードをトリガすることに注意してください。弱いプローブが必要な場合は、代わりに述語!in_array('fred', get_declared_classes())を使用する必要があります。