2012-10-25 90 views
5
一個int

我閱讀PHP手冊和我碰到type juggling如何看待字符串作爲一個字符串,而不是在PHP

我很困惑,因爲我從來沒有碰到過這樣的事情來了。

$foo = 5 + "10 Little Piggies"; // $foo is integer (15) 

當我用這個代碼,它返回我15,它增加了10 + 5,當我使用is_int()它返回我真即。 1,我在等一個錯誤,它以後引用我String conversion to numbers在那裏我閱讀If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero)

$foo = 1 + "bob3";    /* $foo is int though this doesn't add up 3+1 
            but as stated this adds 1+0 */ 

現在我應該怎麼做,如果我想治療10只小小豬或bob3爲string,而不是作爲一個int。使用settype()也不起作用。我想要一個錯誤,我不能將5添加到字符串中。

+0

-1問題嚴重嗎? com'on懦夫來吧,並回答我,爲什麼連續無故地降低我的問題和答案? –

回答

4

如果你想要一個錯誤,你需要觸發的錯誤:

$string = "bob3"; 
if (is_string($string)) 
{ 
    trigger_error('Does not work on a string.'); 
} 
$foo = 1 + $string; 

或者,如果你想有一些接口:

class IntegerAddition 
{ 
    private $a, $b; 
    public function __construct($a, $b) { 
     if (!is_int($a)) throw new InvalidArgumentException('$a needs to be integer'); 
     if (!is_int($b)) throw new InvalidArgumentException('$b needs to be integer'); 
     $this->a = $a; $this->b = $b; 
    } 
    public function calculate() { 
     return $this->a + $this->b; 
    } 
} 

$add = new IntegerAddition(1, 'bob3'); 
echo $add->calculate(); 
+2

Vooooo,所以我要拋出一個自定義錯誤? –

+1

@ Mr.Alien:根據你的需要,是的。 PHP沒有「字符串」變量類型。這就是玩雜耍的意義所在。 – hakre

+0

或者更好的措詞:PHP沒有類型安全的操作符來添加。 – hakre

1

這是設計爲PHP的動態的結果鍵入的性質,當然缺乏明確的類型聲明要求。根據上下文確定變量類型。

根據您的例子,當你做:

$a = 10; 
$b = "10 Pigs"; 

$c = $a + $b // $c == (int) 20; 

調用is_int($c)當然會始終爲一個true,因爲PHP已經決定語句的結果轉換爲整數。

如果您正在尋找解釋器發現的錯誤,您將無法得到它,因爲正如我所提到的那樣,該語言內置了一些內容。您可能需要編寫大量難看的條件代碼來測試您的數據類型。

或者,如果你想爲測試參數傳遞給你的函數 - 這是我能想到的,你可能想要做的唯一場景 - 你可以相信客戶調用你的函數來知道它們是什麼這樣做。否則,返回值可以簡單地記錄爲未定義。

我知道來自其他平臺和語言,可能很難接受,但不管相信與否,用PHP編寫的很多優秀的庫都遵循相同的方法。

+0

感謝您的詳細解釋 –

相關問題