Nasıl PHP eval'd fonksiyonu için kaynak kodunu bulmak?

3 Cevap php

Ben bir dize (kullanıcı tanımlı) PHP fonksiyonları için kaynak kodunu almak için bir yol bulmaya çalışıyorum.

Normal kod için bu ben fonksiyon tanımlanır dosya ve linenumbers bulabilirsiniz yansıma kullanarak, kolay, o dosyayı açın ve işlev kaynak kodunu okuyabilirsiniz.

Bir fonksiyon eval'd kodunda tanımlı ise bu işe yaramaz. Ben tüm eval'd kod kaydını tutmak istemiyorum.

Bu mümkün mü? Eğer evet ise, o zaman nasıl?

Example code:

<?php

function myfunction() {
	echo "Test";
}

eval('
function myevalfunction() {
	echo "Test";
}
');

$a = new ReflectionFunction('myfunction');
echo $a;

$b = new ReflectionFunction('myevalfunction');
echo $b;

?>

Output:

Function [ <user> <visibility error> function myfunction ] {
  @@ test.php 3 - 5
}
Function [ <user> <visibility error> function myevalfunction ] {
  @@ test.php(11) : eval()'d code 2 - 4
}

3 Cevap

Nasıl kendi eval işlevini tanımlamak, ve orada izleme yapmak hakkında?

function myeval($code) {
     my_eval_tracking($code, ...);  # use traceback to get more info if necessary
     # (...)
     return eval($code);
}

O dedi, ben bu durumda eval Kent Fredric duygularını bir sürü paylaşmak yok.

Sadece dosyaları kendiniz arama olamaz? grep veya WinGrep bunun için idealdir.

Eğer değilse pecl fonksiyon rename_function denemek ve işlevler yaratmak tüm eval aramaları giriş yapabilirsiniz.

Benim ilk tepki eval işlevi oluşturmak için neredeyse 0 iyi bir sebebi var demek ki.

Siz, yani şartlı işlevler oluşturabilirsiniz:

if ( $cond ){ 
   function foo(){ 

   }
}

İsterseniz closure davranış gibi eval PHP5.3 kadar bunu yapmak için tek yoldur, ama onun EPIC kötü şeyler sanırım ve bunu tüm maliyet kaçınmak gerekir.

Burada neden:


01 <?php
02 
03 function foo ()
04 {
05   eval( '
06     function baz()
07     {
08        eval("throw new Exception();"); 
09     }
10   '); 
11   baz(); 
12 }
13 
14 
15 
16 try{ 
17   foo(); 
18 }catch( Exception $e ){
19   var_dump($e); 
20 }
21 try{ 
22   foo(); 
23 }
24 catch( Exception $e ){
25   var_dump($e);
26 }

Hangi bu yayar:



object(Exception)#1 (6) {
  ["message:protected"]=>
  string(0) ""
  ["string:private"]=>
  string(0) ""
  ["code:protected"]=>
  int(0)
  ["file:protected"]=>
  string(50) "/tmp/xx.php(10) : eval()'d code(4) : eval()'d code"
  ["line:protected"]=>
  int(1)
  ["trace:private"]=>
  array(3) {
    [0]=>
    array(3) {
      ["file"]=>
      string(31) "/tmp/xx.php(10) : eval()'d code"
      ["line"]=>
      int(4)
      ["function"]=>
      string(4) "eval"
    }
    [1]=>
    array(4) {
      ["file"]=>
      string(11) "/tmp/xx.php"
      ["line"]=>
      int(11)
      ["function"]=>
      string(3) "baz"
      ["args"]=>
      array(0) {
      }
    }
    [2]=>
    array(4) {
      ["file"]=>
      string(11) "/tmp/xx.php"
      ["line"]=>
      int(17)
      ["function"]=>
      string(3) "foo"
      ["args"]=>
      array(0) {
      }
    }
  }
}

Fatal error: Cannot redeclare baz() (previously declared in /tmp/xx.php(10) : eval()'d code:2) in /tmp/xx.php(10) : eval()'d code on line 5

Call Stack:
    0.0002     115672   1. {main}() /tmp/xx.php:0
    0.0006     122304   2. foo() /tmp/xx.php:22

O kadar kötülük, çok az çaba.