2011-09-16 51 views
2

在函數調用中設置變量值 - 我沒有看到這麼多,這是否被認爲是良好的做法?PHP - 在函數參數中賦值 - 好的做法?

function myUpdate($status){ 
    ... 
} 

myUpdate($status = 'live'); 

我個人很喜歡它,因爲它是更具描述性的。我反過來更頻繁地看到它,即在函數定義中分配一個默認值。

+0

哇,這個工作嗎? :O – Rijk

+5

你知道這樣做不會以任何方式影響函數的執行,只在調用範圍中分配一個局部變量? –

+0

@Rijk是的,它的工作原理是因爲PHP中賦值的結果是分配的值。 – Phil

回答

5

這是一個非常糟糕的主意,因爲它基本上是代碼混淆。 PHP確實不支持支持關鍵字參數,這可能會導致怪異的東西。案例分析:

function f($a, $b){ 
    echo 'a: ' . $a . "\n"; 
    echo 'b: ' . $b . "\n"; 
} 
f($b='b-value', $a='a-value'); 

這個程序不只是輸出

a: b-value 
b: a-value 

而且定義變量$b,並在全球範圍內$a。這是因爲

f($b='b-value', $a='a-value'); 
// is the same thing as ... 
$b = 'b-value'; 
$a = 'a-value'; 
f($b, $a); 

有一些好的做法可以做,使記憶方法的參數更容易:

  • 配置編輯器/ IDE顯示功能上的亮點簽名。
  • 如果一個函數有很多的描述某種狀態的參數,考慮將其移動到* objec * T(持有而不是狀態)
  • 如果功能只是需要大量的參數,讓它走一個陣列所有非必要的。這也使得該方法調用者完全不擔心選擇衆多,她只是需要知道的人,她的興趣。
+0

它不是代碼混淆。如果在函數中有3個bool參數,那麼以描述性方式添加變量實際上會提高可讀性。 –

+0

@Darhazer它改善了可讀性,直到有人改變了方法的簽名。從那以後,這種做法會主動誤導程序員關於實際方法簽名。 – phihag

2

所有的開玩笑,認真爲什麼你使用它?你必須認識到它與分配默認值完全不同。你在這裏做的是將該值賦給一個變量,然後將該變量傳遞給該函數。結果是,在函數調用之後,$status變量仍然被定義。

myUpdate($status = 'live'); 
echo $status; // "live" 

即使這是你想要什麼,我會說這不僅僅是分裂出來的兩行描述

1

那麼,默認值是不同的東西。

// if you call myUpdate without argument, it will have $status with value live 
function myUpdate($status = 'live'){ 

} 

調用此:

myUpdate($status = 'live'); 

等同於:

myUpdate('live'); 

與作爲唯一的區別呼叫後,如果你這樣稱呼它myUpdate($status = 'live');你將保持$status VAR值爲live在您調用函數的範圍內,而不在其內部。

但恕我直言其更可讀做這樣的:

$status = 'live'; 
myUpdate($status); 
2

不,這不是因爲它的額外的代碼。嘗試:

myUpdate('live' /*status*/, 42 /*maxTries*/);

或者,如果你真的想命名的參數,你可以使用地圖:

myUpdate(array(
    'status' => 'live' 
)); 

一般而言,這會殺了類型安全,但PHP沒有任何,反正。