2016-04-29 15 views
-4

データベースから多くのPHPコードスニペットの1つを選択し、evalを使用して実行するPHPスクリプトがあります。場合によっては、2つのコードスニペットが同じ名前の関数を宣言しようとすると、「関数を再宣言できません」という致命的なエラーが発生します。コードスニペット内の関数名の編集はオプションではありません。スコープを作成する方法はありますか、あるいは関数が互いに上書きするようにする方法はありますか?または他の良いアイデア?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

本当に3つの選択肢があります。変数あなたがする必要があるだろう第二の例では

// 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(); 
} 

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(); 

アサイン機能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

1000sのコードスニペットがあります。すべてのものを編集する方法はありません。たとえ関数が同じ名前であっても、私は同じことをしているわけではありません!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

1000sのコードスニペットがあります。私はすべてのものを編集することはできません。数ヶ月かかるでしょう。 – user4712608

+0

その後、同じ名前の2つの関数をPHPで同じスコープで実行することはできないので、あなたは戸惑っていると思います。コードを編集したくない場合は、問題をどのように解決すると思いますか? – Monty

関連する問題