2017-03-10 202 views
0

我想检查一个函数是否包含一个名为$marker的变量。PHP - 检查函数是否包含

这就是我想要做的事:

if(function('head') contains '$marker') { 
    return true; 
} 

有没有办法做到这一点?

+2

为什么?这样做没有真正的理由吗?函数中使用的变量只应该在函数本身内部相关。你究竟在努力实现什么? –

+3

简短答案是“否”。你没有理由需要这样的功能,除了设计不佳的程序。你想要达到什么目的?不管它是什么,肯定还有其他(“正确的”)方法来做到这一点。 – axiac

+0

@MarkBaker我试图阻止来自插件的一些垃圾邮件,我不想修改插件文件本身,因为一旦它们更新,垃圾邮件就会回来。 –

回答

0

嗯...它不是内置于PHP,坦率地说,更改文件会更好,但对于科学原因,我写了一个检查它。它会在每个函数调用中获取文件名的内容,所以我建议,如果您多次使用它,将文件的内容存储在另一个变量中,但是,这将为您提供有关如何执行此操作的功能视图:

<?php 

function test() { $marker;} 

function negativeTest() { 
    $noMarker; 
} 

function checkFunction($function, $variable, $filename) { 
    $file = file_get_contents($filename); 
    preg_match_all("/function\s+([a-z0-9_-]+)\s*\(.*?\)\s*\{((\n|.)*?)\}/im",$file,$matches); 
    for ($i = 0; $i < count($matches[1]); $i++) { 
     if ($matches[1][$i] == $function && strpos($matches[2][$i], $variable) != false) { 
      return true; 
     } 
    } 
    return false; 
} 

echo checkFunction("test","\$marker","index.php"); 

?> 
+1

我永远不会那样做 – smarber

+0

我从来没有想过这个编程问题,所以我决定写一些可以做到这一点的东西。 (并且,不,我不会使用它)。 – Neil

+0

你可能会更好地使用AST(假设你知道文件名在哪里定义函数),或者使用反射(可以直接使用函数而不需要知道文件名) –