2016-04-29 42 views
-4

我有一個PHP腳本,從數據庫中選擇許多PHP代碼片段之一,並使用eval執行它。在某些情況下,如果兩個代碼片段嘗試聲明具有相同名稱的函數,則會發生致命錯誤「無法重新聲明函數」。編輯代碼片段中的函數名稱不是一個選項。有什麼方法可以創建一個範圍或者可能有功能相互覆蓋?還是其他更好的想法?使用PHP eval來運行代碼導致致命錯誤:無法重新聲明函數

謝謝。

編輯:循環此代碼。

ob_start(); 
try { 
    $result = eval($source_code); 
} catch(Exception $e) { 
    echo "error"; 
} 
$error = ob_get_clean(); 
+2

我們可以看到你實際上是試圖做? – DevDonkey

+2

@DevDonkey我可以看到完美的代碼!你不是通靈嗎?獲取它:-) – MonkeyZeus

+0

如果您發佈了一些代碼,我們可能會提供幫助,否則重命名一個函數或將其移動到一個類中可能會失敗。你也可以使用'function_exists' – DaOgre

回答

1

你有三種選擇,真的。

function_exists()
// this will check for the function's existence before trying to declare it 
if(!function_exists('cool_func')){ 
    function cool_func(){ 
     echo 'hi'; 
    } 
} 

// business as usual 
cool_func(); 

分配功能到可變

// this will automatically overwrite any uses of $cool_func within the current scope 
$cool_func = function(){ 
    echo 'hi'; 
} 

// call it like this 
$cool_func(); 

在PHP Namespacing> = 5.3.0

/* WARNING: this does not work */ 
/* eval() operates in the global space */ 
namespace first { 
    eval($source_code); 
    cool_func(); 
} 

namespace second { 
    eval($source_code); 
    cool_func(); 
} 

// like this too 
first\cool_func(); 
second\cool_func(); 

/* this does work */ 
namespace first { 
    function cool_func(){echo 'hi';} 
    cool_func(); 
} 

namespace second { 
    function cool_func(){echo 'bye';} 
    cool_func(); 
} 

隨着你將需要第二個例子eval()每次你需要使用$cool_func範圍內的DB一次代碼,見下圖:

eval($source_code); 

class some_class{ 
    public function __construct(){ 
     $cool_func(); // <- produces error 
    } 
} 

$some_class = new some_class(); // error shown 

class another_class{ 
    public function __construct(){ 
     eval($source_code); // somehow get DB source code in here :) 
     $cool_func(); // works 
    } 
} 

$another_class = new another_class(); // good to go 
+0

有1000個代碼片段。沒有辦法編輯每一個。同樣,即使函數具有相同的名稱並不意味着它們做同樣的事情,所以我不能使用!function_exists – user4712608

+0

@ user4712608請參閱我的編輯:-) – MonkeyZeus

+0

但是,並非所有這些解決方案都需要編輯代碼數據庫中的片段? – user4712608

0

嗯,正如其他人所說,你應該張貼代碼,以便我們能更好地幫助你。但是你可能想看看PHP OOP,你可以在類內發揮好方法,並引用它們的方式:

ClassOne::myFunction(); 
ClassTwo::myFunction(); 

的看到這個更多:http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php

+0

有1000個代碼片段。我無法編輯每一個。這將需要幾個月。 – user4712608

+0

然後我猜你已經搞砸了,因爲你不能聲明兩個具有相同名稱的函數在PHP中的相同範圍內運行。如果你不想編輯任何代碼,你到底希望如何解決這個問題? – Monty

相關問題