元語言編程,都是要用在最靈活的地方的。
最近的任務,設計一個極為靈活的試題計算項目,而這最大的困難就是,幾套試卷的得分計算規則都不一樣。
如果要按照一般的方法,可能就直接寫六套程式完事,但這其中有大量相同的部分,如果設計不好,則會導致大量代碼冗餘,造成維護困難。
為此,要精心設計一個方法,利用元語言編程,將不同的邏輯寫到設定檔中,形成一個統一的規則,就可以完成任務了。
閑話eval函數
PHP是一門靈活的指令碼語言,既然是指令碼語言,那麼一般都會提供相應的元編程方法,最古老的便是eval函數。
Eval函數最早在lisp中的實現,被人們廣為接受,eval函數接受一個字串作為參數(當然在lisp中是列表),然後將這段字串中的值作為代碼執行。
Eval函數實際上是調用瞭解析器內建函式,通過對文本進行詞法分析,文法分析,處理當前符號表,然後進行執行。
$string = 'Bierglas';$name = 'Binding-Lager';$str = 'Das ist mein $string, voll mit $name.';echo$str . "\n";eval ("\$str = \"$str\";");echo$str . "\n";
這段php代碼,就是eval函數的一個最好例子,當然,這裡還用到了php中的一個重要特性,單引號引起來的,是純的字串,而雙引號引起來的部分,則包含了大量的轉義資訊,例如:$開頭的變數會被格式化進去,而\n也只有在雙引號下才是換行,否則僅僅輸出\n。
下面是執行結果:
$ php test.php Das ist mein $string, voll mit $name.Das ist mein Bierglas, voll mit Binding-Lager.
php函數的特殊調用
說完eval函數,其實php還有一些便利的內建函式可以使用。
call_user_func ,可以根據字串中的名字調用一個php函數
call_user_func_array,傳遞的參數可以是一個數組,這樣就避免了不定參數的傳遞問題。
/** * @Author: sxf * @Date: 2015-07-29 23:00:36 * @Last Modified by: sxf * @Last Modified time: 2015-07-29 23:36:16 */functiona($b, $c) {echo$b ."\n"; echo$c ."\n"; } call_user_func_array('a', array("111", "222"));
本文屬 西風逍遙遊 原創, 轉載請註明出處: 西風世界 http://blog.csdn.net/xfxyy_sxfancy
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
以上就介紹了PHP的元語言編程,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。