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
/*
此示例在 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
// 此代码已在 PHP 7.2 上测试
class Foo {
function
test() {
printf("%-20s %-20s %s\n", '类型', '成功?', '转换结果');

// settype() 应该抛出致命错误,因为 $this 无法重新赋值
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, TRUE));
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();
?>
以下是结果
类型 成功? 转换结果
bool 1 Foo 对象
(
)

Notice: 在 C:\php\examples\oop-settype-this.php 的第 9 行中,无法将 Foo 类的对象转换为 int

int 1 Foo 对象
(
)

Notice: 在 C:\php\examples\oop-settype-this.php 的第 10 行中,无法将 Foo 类的对象转换为 float

float 1 Foo 对象
(
)

array 1 Foo 对象
(
)

object 1 Foo 对象
(
)

Warning: settype(): 在 C:\php\examples\oop-settype-this.php 的第 14 行中,类型无效

unknowntype Foo 对象
(
)

NULL 1 Foo 对象
(
)

Catchable fatal error: 在 C:\php\examples\oop-settype-this.php 的第 15 行中,无法将 Foo 类的对象转换为 string

如果 Foo 类实现了 __toString()
<?php
class Foo {
// ...
function __toString() {
return
'Foo object is awesome!';
}
// ...
}
?>
因此,第一个代码片段不会生成 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 操作,您最终将得到一个具有空(未 unset!)第一个元素的单元素数组。因此,追加到它将从索引 1 开始追加。至于为什么 reset() 什么也不做

"当您使用空括号为数组变量赋值时,该值将添加到数组的末尾。"

数组计数器的位置无关紧要;值添加到末尾,而不是计数器位置。
To Top