目标是:
#define sum( f1, f2 ) ( f1 + f2 )
,其中
sum(2,2)
在PHP中是4。这有可能吗?如果我可以打电话,那就更好了:
$s = 'first';
APPEND ' and second';
当append被定义为函数/方法/其他附加到$s
的东西,所以在这两行之后$s
将是'第一和第二'。
答案 0 :(得分:3)
C中的宏点是它们在编译时被扩展。
因此,使用宏不会对代码的速度产生影响,而函数也会这样做。
因此,使用的一个例子是:
#define MYPRINTF(x) printf("MYPRINTF says : %s\n",x)
MYPRINTF("blah");
上面的代码将由编译器直接翻译成:
printf("MYPRINTF says : %s\n","blah");
它的全部意义在于它比定义一个函数更快,例如:
void myprintf(char *x)
{
printf("myprintf says : %s\n","blah");
}
因为没有开销(在函数中,你需要将参数推送到堆栈等)。
在PHP这样的解释语言中,由于所有内容都是在运行时直接执行的,所以上面的内容并不成立,因此使用像C #define
这样的机制绝对没用 - 因此,回答你的问题问题,只需使用普通功能。
答案 1 :(得分:2)
只是想一想你的意见
function withVeryLongWroteByAnIdiot() {
....
}
function xFunc() {
return withVeryLongWroteByAnIdiot();
}
答案 2 :(得分:1)
PHP在这个意义上不支持宏,这个(非常有效)的参数我认为这与PHP中的普通函数没有太大区别。
毕竟,在运行时解释语言中使用这样的概念并不是没有任何价值。
答案 3 :(得分:0)
我不相信PHP支持宏。如果你考虑一下,C中的宏不是花哨的常量,而是常量是世界上最无聊的C宏。 PHP只能通过define function了解枯燥的形式。
尽管如此,我不同意其他受访者的有效性。它们有一个合理的原因:当你想使用内置函数来预处理某些东西时。例如:
macro default_if_empty_value(value, default) (empty(value) ? default : value)
如果您尝试将其作为函数编写并调用它:
default_if_empty_value($this->that['something']->or[$other], 'Not here.');
然后,如果未定义该变量链的任何部分,您将收到PHP警告,并且扩展版本更难以阅读:
empty($this->that['something']->or[$other]) ? 'Not here.' : $this->that['something']->or[$other];
PHP代码已编译,但它是在运行时编译的。像这样的宏将由PHP解释器扩展,然后编译成PHP字节码。这个字节码通常由PHP解释器或像APC这样的附件缓存。