1

是否可以在两个文件中定义相同的函数,包含它们,然后一次性调用这两个函数,例如

== 文件 1.php ==

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

== 文件2.php ==

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

== 文件 3.php ==

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

- 这将输出:

File 1!
File 2!

这是不可能的,我将如何解决这个问题?

谢谢,托马斯·爱德华兹

4

4 回答 4

3

It wouldn't. You would get an cannot redclare function error. You have to use the methods of classes instead, they can have the same names.

于 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

您无法重新定义全局函数(在 runkit 之外,但那是不好的巫毒教),因此您仍然可以选择使用类驱动解决方案或匿名函数驱动解决方案,如下所示。

您可以编写一个函数来将所有包含的函数组装到一个调用队列中(这只是另一个运行队列的匿名函数):

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

并按照您的描述从每个文件返回匿名函数,而不是重新定义全局函数:

文件1.php

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

文件2.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 回答
1

不,这不可能。你会得到一个错误,因为你调用了两次相同的函数。

于 2012-07-13T05:37:13.087 回答