0

重複の可能性:
PHPで実行時に関数を削除する

実行中にさまざまなファイルを含むスクリプトがあります。すべてのファイルに同じ名前の関数が含まれています。現在含まれているものだけが存在する必要があります。インクルードを含む動的ファイルを有効にする方法はありますか?致命的なエラーが発生することはありません:function()を再宣言できませんか?つまり、前の関数の名前を変更するか、削除する必要があります。

関数は古典的な方法で宣言されますfunctionfn(){;}

4

3 に答える 3

1
if (!function_exists('myFunction')) {
    function myFunction() {
        ....
    }
}

ロードされた関数の最初のバージョンのみを定義しますが、runkitまたはapd拡張機能(または同様のもの)を使用していない限り、関数の名前を変更したり、関数を削除したりすることはできません

于 2012-09-11T17:15:48.483 に答える
1

関数を「function_exists」チェックでラップする必要があります。

if (!function_exists('my_func')){

  function my_func(){
    //...
  }

}

あなたはここでより多くの詳細を見つけることができます:http://php.net/manual/fr/function.function-exists.php

于 2012-09-11T17:15:53.747 に答える
0

各ファイルが同じ名前のトップレベル関数を定義するのではなく、非常に単純なOO構造を使用することを検討してください。

あなたがこのようなものを持っていると仮定します:

switch ( $some_condition )
{
    case 'normal':
    default:
        include_once 'normal_function.php';
    break;
    case 'special':
        include_once 'special_function.php';
    break;
    case 'secret':
        include_once 'secret_function.php';
    break;
}

do_the_action();

次のようなものに置き換えることができます。

switch ( $some_condition )
{
    case 'normal':
    default:
        include_once 'normal_class.php';
        $handler_object = new Normal_Class();
    break;
    case 'special':
        include_once 'special_class.php';
        $handler_object = new Special_Class();
    break;
    case 'secret':
        include_once 'secret_class.php';
        $handler_object = new Secret_Class();
    break;
}

$handler_object->do_the_action();

次に、含まれている各ファイルで、1つの関数ではなく、次のようにその関数を含むクラスを定義します。

class Normal_Class
{
    public function do_the_action()
    {
        // Implementation for normal case goes here 
    }
}

これにより、問題が解決するだけでなく、他の高度な/ OO PHPテクニック(ファイルを自動ロードするため、include_once毎回指定する必要がない、階層やインターフェイスを定義するなど)を学ぶことができます。

于 2012-09-11T17:49:59.747 に答える