因为我们可以在C++中定义循环模板,以便缩短编码:
#define fo(a,b,c) for( a = ( b ); a < ( c ); ++ a )
在PHP中有没有同样的方法?
谢天谢地没有。有很多可怕的事情可以让PHP变得不可读,但这不是其中之一。
PHP默认情况下不使用预处理器。作为一种动态语言,没有一个构建步骤可以作为其一部分运行。你可以使用第三方预处理器,比如CCPP,当然你也可以自己编写,但它们可能会大大改变你的工作流程。
一个有趣的PHP预处理器是PiHiPi,它试图为语言添加有用的功能,比如类似JSON的数组语法,而不需要每次都写array()
。不幸的是,作者已经撤回了它。
免责声明:嗯,这并不完全是预处理器宏,但由于PHP的"动态"特性,不需要/使用预处理器。但是,您可以将函数封装在其他函数中,如下面的示例所示。
是的,您可以通过创建自己的函数来实现这一点,该函数也被传递一个回调。以下是示例:
// FO function
function fo($b, $c, $callback) {
for ($a = $b; $a < $c; ++$a) {
$callback($a);
}
}
// example of usage
fo(2,10, function($a){
echo '['.$a.']';
});
上面的代码在PHP 5.3中工作,并输出以下内容:
[2][3][4][5][6][7][8][9]
像这样的东西怎么样
function my_macro($a, $b, $c) {
$args = func_get_args();
array_shift($args);
array_shift($args);
array_shift($args);
return call_user_func_array("something_horrifically_long_involving_{$a}_{$b}_and_{$c}", $args);
}
CCPP似乎是最接近可用的东西:
#define macroFunction(op1,op2,op3) ((int)op1/((int)op2+(int)op3))
#define hash_hash # ## #
#define showCExamples 1
#if showCExamples
//Reference: http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation
#define MYCASE(item,id) '
case id: '
item##_##id = id;'
break
switch(x) {
MYCASE(widget,23);
}