2011-12-03 10 views
1

私は約20の機能を登録するPHPスクリプトを持っています。理想的にはrequire_onceがロードされます。私は何とかして何度か読み込まれても、関数を再登録しようとはしないようにしたい。私は!function_existsにそれぞれの宣言をラップすることができますが、もっと速い方法があるのだろうかと思います。 (または!function_existsへの20回の呼び出しは無視できると思いますか?)exitを使用してみましたが、エラーが発生します。エラーを投げずに終了することは可能ですか?終了PHPスクリプトエラーなし

if (/* already loaded */) { 
    /* leave gracefully */ 
} 

/* declare ~20 functions */ 

答えて

4
if (!defined('ALREADY_LOADED')) { 
    define('ALREADY_LOADED', true); 
    // rest of your code goes here 

} 

は、これは一定のALREADY_LOADEDが定義されているかどうかをチェックし、そうでない場合、それは定数を定義し、必要な他のものは何でもします。

一度実行すると、定数が定義され、2回目は実行されません。

ALREADY_LOADEDよりもわかりやすい定数名を使用することをお勧めします。

+0

私はグローバルな使い方を考えましたが、定数がもっと簡単だと思います。 – ryanve

+0

異なるファイルで同じ定数名を使用しないでください。 ;) –

+0

これは多くの場合、他の言語のインクルードプロテクターと呼ばれています;) –

1

著者として、あなたは再登録機能に関する問題はすべきではない、もっとそして一度それを必要とする(またはconsistantly require_once()を使用)していない場合。

エラーなしで終了する場合は、die()を試してください。

+0

'die()'はエイリアス 'exit()'であり、致命的なエラーが発生します – ryanve

1

私は最初のステップで機能を再宣言しないようにしようと考えています(ここでは複数回必要です)。 20x function_exists()には何も費用はかかりませんが、書き込みとラッピングのみです) おそらく、代わりにクラス/メソッドを使うことができます。

+0

私の元の考えはクラスを使用することでしたが、それを働かせる。私は 'class RAVE {/ * declarations * /}'にラップしてみました。その後、$ rave = new RAVE(); – ryanve

1

function_existsは悪くありません。

次の方法でPHPスクリプトファイルを作成できます。

/* file1.php */ 
if(!defined('FILE1')) { 
define('FILE1', 1); 
///////////////////////// 
// PUT file contents here. 

///////////////////////// 
}// file.php finished. 

ここで、このファイルを必要なだけ多く含めることができます。何も再定義されません。私はOOPを使用して思う

2

は が

class SimleClass{ 
    public static function func1($arg){...} 
} 

はそれ SimpeClass :: func1の($の引数)を使用する静的関数を持つクラスとして使用することができる最も現実的な方法です。

またはsigleton

class SimleClass{ 
    protected static $_instance=null; 
    private function __construct(){...} 
    public static function getInstance(){ 
     if(is_null(self::$_instance) 
      self::$_instance=new SimpleClass(); 
     return self::$_instance; 
    } 
    public function func1($arg){...} 
} 

SimpleClass ::のgetInstance()それを使用する - >関数func1($ argを);

とどのように が

のinclude_once使用することができますし、

function myClassLoader($className){ 
include_once "/lib/$className.php"; 
} 
spl_autoload_register(myClassLoader); 

オートローダー・クラスを実装することができ、それ自体だと思い、それを接続する================== ========================= もっと具体的な答えが必要データ。 おそらくあなたのアプリケーションは、より論理的な構造を得るために並べ替えることができます

+0

Thx-アイデアが好きです。関数がグローバルに公開されるようにしようとしています。つまり、SimpeClass :: func1($ arg)ではなくfunc1($ arg)で呼び出すことができます。これを行うにはどうすればよいですか? – ryanve

+0

この問題の関連性を文脈から離して理解することは非常に困難です。 説明すると、なぜクラスに基づいた便利なソリューションではないのですか? 別の方法がありますか? – nonlux

関連する問題