2010-10-05 151 views
0

我想这样做:设置默认参数,在PHP

function func($var1 = 'Hello', $var2 = "{$var1} World") { echo $var2; } 

这是不可能的!

我的想法是避免我的函数内部有额外的代码行,但我不知道这是否可能。

有人知道如果一个类似的过程是可能的PHP? 谢谢。

+0

这是否真的测试第二个参数“包含”第一个?在这种情况下,我希望我们都在PHP中进行了模式匹配,但不幸的是这种情况并非如此...... – 2010-10-05 12:42:01

+0

即将第一个参数值加上第二个参数值。我认为在这种情况下模式匹配没有意义。 – Katie 2010-10-05 13:35:58

回答

3

像其他答案说,你不能直接在PHP中做这个。我对这些情况的解决方案通常是使用这样的

function func($var1 = 'Hello', $var2 = null) 
{ 
    if ($var2 === null) 
    $var2 = $var1.' Worls'; 
} 

但最大的缺点是你要复制PHP行为,所以你必须变量时,忘记抛出自己的异常,错误的模仿行为类型等

+0

我只是想避免如果陈述,但也许这是不可能的。 – Katie 2010-10-05 10:44:32

0

PHP中没有表达式语言,但可以使用运算符.来连接字符串。

试试这个:

function func($var1 = 'Hello', $var2 = ' Worls') { echo $var1.$var2; } 

不,你不能在函数参数使用它。你为什么要这样?只要在身体功能上做到这一点。如果函数参数中没有逻辑,则会更好。更清晰,更清晰,更可维护。

在性能方面也不太好。您正在创建$var1默认值与$var2默认值之间的依存关系。处理器可以以任何原因(主要是优化)以相反顺序分配默认值,但是由于您引入了依赖关系,因此无法再进行处理,因此处理器必须等到$var1解析为能够分配$var2。得到它?

无论如何,语言不允许你这样做。但至少现在你可以有一个可能的原因,为什么(完全是我的假设,我相信它有更多不同的原因)。

+0

我知道那个操作员。可以连接字符串,但不能在函数参数中使用它。 – Katie 2010-10-05 10:33:07

1

如果你只想$ var2被$ var1预置,那么你可以将它设置在函数的第一行,例如。

function func($var1 = 'Hello', $var2 = " World") { 
    $var2 = $var1 . $var2; 
    echo $var2; 
} 
+0

我知道我可以做这样的事情,但我想避免在我的函数中插入代码行,我问我是否可以。 – Katie 2010-10-05 10:35:23

2

在php本身它是不可能的(请纠正我,如果我worng)。 你想做什么叫做面向方面编程。 但我不知道任何可以接受的Aspect框架的PHP。 例如在java中,您可以使用AspectJ并在调用某个MyClass.method()之前运行代码;以便每次调用MyClass.method();在执行之前,其他代码将自动执行,而不会将其添加到method()方法本身。 这是通过在正确的位置自动插入代码来实现的。

1

我认为这里的基本答案是否定的,这是不可能的,你要问的方式。

最接近你要求的功能类型是使用func_get_args()和相关函数(尽管如其他答案中所述,你的具体用例实际上只需要几个在你的函数顶部有非常简单的代码行)。