2012-03-05 164 views
4

switch語句這是我的示例代碼:問題與PHP

<?php 

$t = 0; 

switch($t) 
{ 
    case 'add': 
     echo 'add'; 
     break; 
    default: 
     echo 'default'; 
     break; 
} 

echo "<br/>"; 

echo system('php --version'); 

這是輸出(codepad.org測試 - 結果是一樣的):

add 
PHP 5.3.6-13ubuntu3.6 with Suhosin-Patch (cli) (built: Feb 11 2012 03:26:01) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies 

什麼是錯在這裏?

+0

大問題。 – jere 2012-03-05 13:49:06

+0

我知道,它看起來很愚蠢,但這種情況發生在我的ZF應用程序中。那$ t變量實際上是$ this-> id屬性,它的參數來自$ _REQUEST數組(來自url)。這在我的情況下總是字符串,現在我知道,如果需要參數錯過了,而不是將其設置爲一個空字符串它將此屬性設置爲一個整數(0).. – 2012-03-05 13:56:51

+1

它不是諷刺!我真的想說這是一個很好的問題:) – jere 2012-03-05 14:08:29

回答

7

您的變量$t具有整數值0。通過switch聲明,您告訴PHP首先將它與值'add'(一個字符串)進行比較。 PHP does this by converting'add'爲一個整數,並且由於the rules of the conversion結果證明是0

因此,採取了第一個分支 - 這可能是令人驚訝的,但它也是預期的。

你會看到預期的行爲,如果你沒有

$t = "0"; 

現在,無論$t'add'都是字符串,所以沒有神奇的轉換正在進行,當然他們比較不等。

+0

謝謝!是的,強制一個值是字符串解決了問題! – 2012-03-05 13:49:12

2

那是因爲你是用字符串..如果你逼的「添加」轉換爲int這將是0比較一個int ..「修理」你的switch語句可以更換

switch($t) 

switch($t . '') 

這樣告訴服務器他應使用T的字符串值(或任何其他方式來實現這一目標)