2013-11-24 80 views
-1

我想存儲功能的陣列PHP存儲功能的陣列

數組發送到另一個頁面

然後執行它

我已經讀過Can you store a function in a PHP array但還是不知道該怎麼辦

這裏是我嘗試

control.php(它從這裏開始)

<?php 

    function getFirstFunction(){ echo "first function executed"; } 

    $data = array(); 
    $data[0] = getFirstFunction(); 
    $data[1] = function(){ echo "second function executed"; }; 
    $data[2] = function(){ require_once "additional.php"; }; 
    $data[3] = "my string"; 


    header('Location: view.php?data='.$data); 

?> 

additional.php

<?php echo "additional included" ?> 

view.php

<?php 
    if(isset($_GET['data'])){ 

     foreach($_GET['data'] as $temp){ 
      if(is_callable($temp)){ 
       $temp; 

      }else{ 
       "its not a function"; 
      } 
     } 
    } 
?> 

我的錯誤=

Warning: Invalid argument supplied for foreach() in D:\Workspace\Web\latihanns\php\get\view.php on line 4

編輯 感謝您通知此代碼其危險。我不會在實際生活中使用此代碼。我只是試着學習數組中的存儲函數然後調用它。那麼我只是好奇,如果我打電話給另一頁。我只是好奇...我讓我的代碼看起來很簡單,因爲我害怕如果我寫了複雜的代碼,沒有人會在這裏,或者我的帖子會因爲本地化而關閉......

+2

'的var_dump($ _ GET [「數據」]);'PS:你知道,即使這是可能的 - 任何人都可以通過任何** **他們要調用服務器上。 – zerkms

+2

你不能只將一個原始數組放入URL中。 –

+2

'$ data [0] = getFirstFunction();'這會在數據數組中存儲'getFirstFunction()'的返回值,而不是代碼。 –

回答

1

如果你想通過除了將字符串轉換爲URL之外,只有選項會將其轉換爲與原始類型相反的字符串形式。 PHP提供稱爲serialize()的函數,它將任何東西都轉換爲字符串。之後,您可以撥打unserialize()將字符串轉換回原始數據。所以,你必須在control.php改變一行到這一點:

header('Location: view.php?data='.serialize($data)); 

在文件view.php你有一條線改成這樣:

foreach(unserialize($_GET['data']) as $temp){ 

但你必須修復比這更多的事情。如果您有可調用變量,則不能使用$variable調用函數,但使用$variable()。如果你在變量中有真正的函數(匿名函數,Closure等等),或者如果變量是簡單的字符串和存在函數的名字,那麼在PHP中並不重要。

但是,你還有另一個bug在control.php。代碼$data[0] = getFirstFunction();不會傳遞函數getFirstFunction使其可調用,它只是調用函數並將其返回值賦給變量。您可以將getFirstFunction定義爲中的函數的匿名函數,或者將其作爲字符串傳遞,如$data[0] = 'getFirstFunction'這樣可以工作。

最後 - 正如任何人在這裏提到的 - 這是非常危險的 ans你不應該在公共服務器上使用它。

+0

那麼,你認爲一個匿名函數會被序列化麼? – zerkms

+0

我剛剛意識到,我不知道anonymouse函數(Closure)是否可以(不)序列化(很可能不是)。你必須嘗試。但是,如果你將在view.php中定義這些函數,並且你將把它們的名字作爲字符串傳遞到那個數組中,那麼它肯定會有效。 –

+0

那麼,你的整個答案的重點是什麼? PS:我不是一個op – zerkms