Forum und email

各類變數間的互換

PHP 既不需要也不支援明確地公告變數的形態。 變數的類形視它所儲存的資料而定: 如果你把文句存到 var當中, var 會是文句形變數; 如果存入的是整數 var,它就變成整數形。

下面用 "+" 加號的運算來示範 PHP 怎樣自動調整變數的形態。 如果加數和被加數中任何一個是浮點數, 運算的結果將會是浮點數, 反之則結果會是整數形態。 注意這種調整只是用在運算之中, 並不會改變加數和被加數本來的類形。

$foo = "0";  // $foo is string (ASCII 48)
$foo++;      // $foo is the string "1" (ASCII 49)
$foo += 1;   // $foo is now an integer (2)
$foo = $foo + 1.3;  // $foo is now a double (3.3)
$foo = 5 + "10 Little Piggies"; // $foo is integer (15)
$foo = 5 + "10 Small Pigs";     // $foo is integer (15)

若嫌上面的例子用的句法比較舊, 可以參考 文句變換一節。

如果不想 PHP 自動調節變數的形態而打算自己指定變數在運算中的形態可看 形態套換. 。 如想改變變數的類形, 可使用 settype()函數。

假如你想試本節中的示例, 可以把程式碼部份複制出來然後加上下面一行指令, 你告訴它變數的名字, 它告訴你變數的形態:

echo "\$foo==$foo; type is " . gettype ($foo) . "<br>\n";

Note: PHP 暫時還沒有定義怎把一個非陣列變數自動轉換成陣列變數。

$a = 1;       // $a is an integer
$a[0] = "f";  // $a becomes an array, with $a[0] holding "f"

上面的例子看起來行得通: "f" 會變成是陣列 $a 的第個元素, 現在看看下個示例:
$a = "1";     // $a is a string
$a[0] = "f";  // What about string offsets? What happens?

由於 PHP 用來表示文句中某個字母的句法和用來表示陣列中某個元素的句法是一樣的, 上面的例句會產生歧義: "f" 應該代表文句變數 $a 中的首個字母還是應該代表陣列變數 $a[] 中的第一個元素?
因此在 PHP 3.0.12 and PHP 4.0b3-RC4 兩個版本中, 並沒有定義上述的變換該怎樣做。 解決的辦法目前還在討論當中。

形態套換

和 C 的句法一樣, 要把變數的形態套換成另一種形態可以用圓括號 "( )" 把想指定的類形括起來放在變數前面。

$foo = 10;   // $foo is an integer
$bar = (double) $foo;   // $bar is a double

下列的套換是合法的:

  • (int), (integer) - 當成整數
  • (real), (double), (float) - 當成浮點數
  • (string) - 當成文句
  • (array) - 當成陣列
  • (object) - 當成物件

由於括號中可以放進空格和跳格符號, 所以下面的指令是等效的:

$foo = (int) $bar;
$foo = ( int ) $bar;

某些套換的結果並不能一眼看出來, 進行這樣的轉換時要留意以下幾點。

當把數字或文句套換成陣列時, 數值或整句文句會成為陣列中的首個元素。

$var = 'ciao';
$arr = (array) $var;
echo $arr[0];  // outputs 'ciao'

當把數字或文句套換成物件時, 物件中會自動產生一個叫 SCALAR 的屬性, 當中儲存了套換前變數中的內容。

$var = 'ciao';
$obj = (object) $var;
echo $obj->scalar;  // outputs 'ciao'