標籤:php 函數 元語言 編程
元語言編程,都是要用在最靈活的地方的。
最近的任務,設計一個極為靈活的試題計算項目,而這最大的困難就是,幾套試卷的得分計算規則都不一樣。
如果要按照一般的方法,可能就直接寫六套程式完事,但這其中有大量相同的部分,如果設計不好,則會導致大量代碼冗餘,造成維護困難。
為此,要精心設計一個方法,利用元語言編程,將不同的邏輯寫到設定檔中,形成一個統一的規則,就可以完成任務了。
閑話eval函數
PHP是一門靈活的指令碼語言,既然是指令碼語言,那麼一般都會提供相應的元編程方法,最古老的便是eval函數。
Eval函數最早在lisp中的實現,被人們廣為接受,eval函數接受一個字串作為參數(當然在lisp中是列表),然後將這段字串中的值作為代碼執行。
Eval函數實際上是調用瞭解析器內建函式,通過對文本進行詞法分析,文法分析,處理當前符號表,然後進行執行。
<?php$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
,傳遞的參數可以是一個數組,這樣就避免了不定參數的傳遞問題。
<?php/** * @Author: sxf * @Date: 2015-07-29 23:00:36 * @Last Modified by: sxf * @Last Modified time: 2015-07-29 23:36:16 */ function a($b, $c) { echo $b ."\n"; echo $c ."\n"; } call_user_func_array(‘a‘, array("111", "222"));
本文屬 西風逍遙遊 原創, 轉載請註明出處: 西風世界 http://blog.csdn.net/xfxyy_sxfancy
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
PHP的元語言編程