2017-03-10 247 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(假設你知道文件名在哪裏定義函數),或者使用反射(可以直接使用函數而不需要知道文件名) –