2012-07-13 82 views
1

是否可以在兩個文件中定義相同的函數,包括它們,然後一次調用兩個函數,例如,PHP - 調用兩個相同的功能?可能?

== == 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! 

這是不可能的我將如何解決這個問題?

感謝, 托馬斯·愛德華茲

+5

什麼是你想實現什麼?給我們一些背景將允許我們給出最合適的解決方案:) – F21 2012-07-13 05:28:43

+0

爲什麼不測試它 – 2012-07-13 05:29:42

+0

不,這是不可能的,我甚至不知道它會對它有用。 – deceze 2012-07-13 05:30:57

回答

1

你不能重新定義全局函數(outside of 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 
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(); 
} 
+0

感謝編輯@deceze;) – 2012-07-13 06:05:08