PHP Conference Japan 2024

settype

(PHP 4, PHP 5, PHP 7, PHP 8)

settype設定變數的類型

說明

settype(混合 &$var, 字串 $type): 布林值

設定變數 var 的類型為 type

參數

var

要轉換的變數。

type

type 的可能值為

  • "boolean" 或 "bool"
  • "integer" 或 "int"
  • "float" 或 "double"
  • "string"
  • "array"
  • "object"
  • "null"

回傳值

成功時回傳 true,失敗時回傳 false

範例

範例 #1 settype() 範例

<?php
$foo
= "5bar"; // 字串
$bar = true; // 布林值

settype($foo, "integer"); // $foo 現在是 5 (整數)
settype($bar, "string"); // $bar 現在是 "1" (字串)
?>

注意事項

備註:

“int” 的最大值為 PHP_INT_MAX

參見

新增備註

使用者貢獻的備註 9 則備註

特別注意事項
12 年前
請注意,您不能使用此函數將字串 'true' 或 'false' 轉換為布林變數 true 或 false,因為字串 'false' 是布林值 true。空字串才是 false...

<?php
$var
= "true";
settype($var, 'bool');
var_dump($var); // true

$var = "false";
settype($var, 'bool');
var_dump($var); // 也是 true!

$var = "";
settype($var, 'bool');
var_dump($var); // false
?>
robin at barafranca dot com
16 年前
只是快速提醒一下,因為我簡略地被這個問題困擾了一下

settype() 返回布林值,而不是類型轉換後的變數 - 所以

$blah = settype($blah, "int"); // 錯誤,將 $blah 改為 0 或 1
settype($blah, "int"); // 正確

希望這能幫助其他犯了同樣錯誤的人.. ;)
DarkMaster
3 年前
<?php
/*
這個例子在 Windows 的 PHP-CGI 5.4.13 中比 settype() 函數快 4 倍,
在 Windows 的 PHP-CGI 7.1.3(x64) 中快 8 倍
*/

$v = '12345';

$v = (int)$v;
$v = (string)$v;

?>
sdibb at myway dot com
21 年前
使用 settype 並非將字串轉換為整數的最佳方法,因為它會從第一個非數字字元開始截斷字串。 intval($string) 函式也會做同樣的事情。

如果您正在尋找安全檢查,或者想去除非數字字元(例如清理電話號碼或郵遞區號),請嘗試以下方法

<?
$number=ereg_replace("[^0-9]","",$number);
?>
nospamplease at veganismus dot ch
19 年前
您必須注意,此函式不會永久設定類型!下次您設定該變數的值時,PHP 也會更改其類型。
geoffsmiths at hotmail dot com
4 年前
請注意

使用 settype 將索引陣列轉換為物件時,類型物件的屬性將會是整數

一個簡短的例子

$a = ['1', '2'];

settype($a, 'object');

var_dump($a);

// 輸出
object(stdClass)#1 (2) {
["0"]=>
string(1) "1"
["1"]=>
string(1) "2"
}
matt at mattsoft dot net
18 年前
使用 (int) 取代 settype 函式對我來說效果更好。我一直都是這樣用的。我個人認為 settype 沒有什麼用處。
匿名
5 年前
如果您嘗試從實體方法(僅限類別中)轉換特殊的 $this 變數
* 如果類型為 'bool'、'array'、'object' 或 'NULL',PHP 將靜默返回 TRUE 並保持 $this 不變
* 如果類型為 'int'、'float' 或 'double',PHP 將會產生 E_NOTICE,並且 $this 不會被轉換
* 如果類型為 'string' 且類別未定義 __toString() 方法,PHP 將會拋出可捕捉的致命錯誤
除非作為第二個引數傳遞的新變數類型無效,否則 settype() 將返回 TRUE。在所有情況下,物件都將保持不變。
<?php
// This was tested with PHP 7.2
class Foo {
function
test() {
printf("%-20s %-20s %s\n", 'Type', 'Succeed?', 'Converted');

// settype() should throw a fatal error, as $this cannot be re-assigned
printf("%-20s %-20s %s\n", 'bool', settype($this, 'bool'), print_r($this, TRUE));
printf("%-20s %-20s %s\n", 'int', settype($this, 'int'), print_r($this, TRUE));
printf("%-20s %-20s %s\n", 'float', settype($this, 'float'), print_r($this));
printf("%-20s %-20s %s\n", 'array', settype($this, 'array'), print_r($this, TRUE));
printf("%-20s %-20s %s\n", 'object', settype($this, 'object'), print_r($this, TRUE));
printf("%-20s %-20s %s\n", 'unknowntype', settype($this, 'unknowntype'), print_r($this, TRUE));
printf("%-20s %-20s %s\n", 'NULL', settype($this, 'NULL'), print_r($this, TRUE));
printf("%-20s %-20s %s\n", 'string', settype($this, 'string'), print_r($this, TRUE));
}
}
$a = new Foo();
$a->test();
?>
Here is the result
類型 成功? 已轉換
bool 1 Foo 物件
(
)

注意:類別 Foo 的物件無法轉換為 int,位於 C:\php\examples\oop-settype-this.php 的第 9 行

int 1 Foo 物件
(
)

注意:類別 Foo 的物件無法轉換為 float,位於 C:\php\examples\oop-settype-this.php 的第 10 行

float 1 Foo 物件
(
)

array 1 Foo 物件
(
)

object 1 Foo 物件
(
)

警告:settype():類型無效,位於 C:\php\examples\oop-settype-this.php 的第 14 行

unknowntype Foo 物件
(
)

NULL 1 Foo 物件
(
)

可捕捉的致命錯誤:類別 Foo 的物件無法轉換為字串,位於 C:\php\examples\oop-settype-this.php 的第 15 行

如果類別 Foo 實作了 __toString()
<?php
class Foo {
// ...
function __toString() {
return
'Foo 物件很棒!';
}
// ...
}
?>
因此,第一個程式碼片段不會產生 E_RECOVERABLE_ERROR,而是會印出與其他類型相同的字串,並且不會查看 __toString() 方法返回的字串。

希望這個說明對您有所幫助! :)
ns at canada dot com
24 年前
這個 settype() 的行為對我來說似乎是一致的。引用手冊中的兩個章節

「當從純量或字串變數轉換為陣列時,該變數將成為陣列的第一個元素:」
<pre>
2 $var = 'ciao';
3 $arr = (array) $var;
4 echo $arr[0]; // 輸出 'ciao'
</pre>

而且,如果您(像您上面的程式碼一樣)對一個空變數執行 settype,您最終會得到一個包含空(非未設定!)首個元素的單元素陣列。因此,附加到它將從索引 1 開始附加。至於為什麼 reset() 沒有作用

「當您使用空括號將值賦值給陣列變數時,該值將被添加到陣列的末尾。」

陣列計數器的位置無關緊要;值會添加到末尾,而不是計數器處。
To Top