是否可以在两个文件中定义相同的功能,包括它们然后一次调用两个函数,例如
== 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!
这是不可能的,我将如何解决这个问题?
谢谢, 托马斯爱德华兹
答案 0 :(得分:3)
不会。你会得到一个不能redclare函数错误。您必须使用类的方法,它们可以具有相同的名称。
答案 1 :(得分: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();
}
答案 2 :(得分:1)
不,不可能。你会得到一个错误,因为你两次调用相同的函数。
答案 3 :(得分:1)
您无法重新定义全局函数( outside of runkit,但这是糟糕的voodoo ),因此您的选择仍然是使用类驱动的解决方案,或匿名函数驱动的解决方案,如下所示。 / p>
您可以编写一个函数将所有包含的函数组合到一个调用队列中(这只是另一个运行队列的匿名函数):
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