2010-10-05 90 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()和相關函數(儘管如其他答案中所述,你的具體用例實際上只需要幾個在你的函數頂部有非常簡單的代碼行)。