1

2つのファイルで同じ関数を定義し、それらを含めてから、両方の関数を一度に呼び出すことは可能ですか?

== File1.php ==

function my_function() {
echo "File 1!";
}

== File2.php ==

function my_function() {
echo "File 2!";
}

== File3.php ==

include('File1.php');
include('File2.php');
my_function();

-どちらが出力されますか:

File 1!
File 2!

これは不可能ですか?どうすればそれを回避できますか?

ありがとう、トーマス・エドワーズ

4

4 に答える 4

3

そうではないでしょう。関数を再宣言できませんというエラーが発生します。代わりにクラスのメソッドを使用する必要があります。同じ名前にすることができます。

于 2012-07-13T05:29:54.570 に答える
2

両方のメソッドが同じ署名を持っているため、これは機能しません。つまり、PHPは最初に呼び出すメソッドを認識していないため、エラーが発生します。

ただし、同じ名前のメソッドを持つオブジェクトをいくつか作成し、それらをリストに格納してから、それらを循環させることができます。

以下はテストされていませんが、原則はそこにあります。

// Abstract class acts as a common interface to allow using the same method name
abstract class MyAbstract {  
    abstract function my_function();
}  

class FirstClass {
    function my_function() {
        echo "Class 1!";
    }
}

class SecondClass {
    function my_function() {
        echo "Class 2!";
    }
}

$objectArray[] = new FirstClass();
$objectArray[] = new SecondClass();

foreach($objectArray as $object){
    $object->my_function();
}
于 2012-07-13T05:38:24.083 に答える
1

いいえ、できません。同じ関数を2回呼び出したため、エラーが発生します。

于 2012-07-13T05:37:13.087 に答える
1

グローバル関数を再定義することはできません(runkitの外部ですが、それは悪いブードゥーです)。そのため、次のように、クラス駆動型ソリューションまたは無名関数駆動型ソリューションを使用するオプションが残ります。

含まれているすべての関数を呼び出しキューにアセンブルする関数を作成できます(これは、キューを実行する別の無名関数です)。

function queueFunctions(array $functions){
    return function() 
    use ($functions) {
        foreach($functions as $function) {
            $function();
        }
    };
}

そして、グローバル関数を再定義するのではなく、説明したように各ファイルから無名関数を返します。

file1.php

return function() {
    echo 'Hello';
};

file2.php

return function() {
    echo 'World';
};

次に、次のことができます。

// both
$function = queueFunctions([
    include('file1.php'), 
    include('file2.php'),
]);

$function(); // HelloWorld

// one of them    
$function = queueFunctions([
    include('file2.php'),
]);

$function(); // World

// repeated calls
$function = queueFunctions([
    include('file2.php'),
    include('file1.php'),
    include('file2.php'),
]);

$function(); // WorldHelloWorld
于 2012-07-13T06:18:49.827 に答える