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

参见

添加注释

用户贡献的注释 17 个注释

75
特殊说明
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
?>
47
robin at barafranca dot com
16 年前
只是一个快速说明,因为这让我短暂地陷入了困境

settype() 返回 bool,而不是类型转换的变量 - 所以

$blah = settype($blah, "int"); // 是错误的,会将 $blah 更改为 0 或 1
settype($blah, "int"); // 是正确的

希望这能帮助其他犯同样错误的人。;)
7
DarkMaster
3 年前
<?php
/*
此示例在 PHP-CGI 5.4.13 中比 settype() 函数快 4 倍,
在 PHP-CGI 7.1.3(x64) for windows 中快 8 倍
*/

$v = '12345';

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

?>
18
sdibb at myway dot com
20 年前
使用 settype 不是将字符串转换为整数的最佳方法,因为它将在第一个非数字字符开始的地方截断字符串。函数 intval($string) 执行相同操作。

如果您正在寻找安全检查,或要删除非数字字符(例如清理电话号码或邮政编码),请尝试以下方法

<?
$number=ereg_replace("[^0-9]","",$number);
?>
10
nospamplease at veganismus dot ch
19 年前
您必须注意,此函数不会永久设置类型!下次您设置该变量的值时,PHP 也会更改其类型。
1
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"
}
1
matt at mattsoft dot net
18 年前
使用 (int) 而不是 settype 函数对我来说效果更好。我一直都在使用它。我个人不明白 settype 在哪里有用。
0
匿名
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));
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 Object
(
)

Notice: Object of class Foo could not be converted to int in C:\php\examples\oop-settype-this.php on line 9

int 1 Foo Object
(
)

Notice: Object of class Foo could not be converted to float in C:\php\examples\oop-settype-this.php on line 10

float 1 Foo Object
(
)

array 1 Foo Object
(
)

object 1 Foo Object
(
)

Warning: settype(): Invalid type in C:\php\examples\oop-settype-this.php on line 14

unknowntype Foo Object
(
)

NULL 1 Foo Object
(
)

Catchable fatal error: Object of class Foo could not be converted to string in C:\php\examples\oop-settype-this.php on line 15

如果类 Foo 实现 __toString()
<?php
class Foo {
// ...
function __toString() {
return
'Foo object is awesome!';
}
// ...
}
?>
所以第一个代码片段不会生成 E_RECOVERABLE_ERROR,而是打印与其他类型相同的字符串,而不是查看 __toString() 方法返回的字符串。

希望这有帮助!:)
0
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() 没有起作用

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

数组计数器在哪里并不重要;值被添加到末尾,而不是计数器。
-1
NWdev
15 年前
在尝试将字符串数组转换为整数数组时,
我尝试使用 settype 和 array_walk。

<?php
//$numArray 由另一个进程生成
$numArray = array('13','14','33');

var_dump($numArray);

// 我的转换函数
function str_to_int($val){
// 记住:settype($x, 'int') 返回布尔值 (1=成功, 0=失败)
//--> 所以返回 $x 来返回新值
settype($val,'int');
echo
"<br />gettype = ".gettype($val)."<br />";
return
$val;
}

array_walk($numArray,'str_to_int');

var_dump($numArray);
?>

这两个 var_dumps 都返回以下内容
<?php
array(3) { [0]=> string(2) "13" [1]=> string(2) "14" [2]=> string(2) "33" }
?>

gettype echo 将显示该值为整数。

所以看来 settype($val,'int') 进行了转换,
但函数返回值仍然是字符串。
由于 settype 返回布尔值,因此使用
<?php $val = settype($val, 'int'); ?>
不是一个选项。

我用以下代码解决了我的数组值转换问题
<?php
$numArray
=
array_map(create_function('$value', 'return (int)$value;'),$numArray);
?>
感谢这里发布的帖子
http://usrportage.de/archives/
808-Convert-an-array-of-strings-into-an-array-of-integers.html

也许这可以省去其他人一些无谓的尝试。

同时感谢 robin at barafranca dot com 指出
settype 的布尔返回值。
-1
reinier_deblois at hotmail dot com
19 年前
除了 settype,你还可以使用
<?php

$int
=593; // $int 是一个整数

$int.=""; // $int 现在是一个字符串
-1
memandeemail at gmail dot com
19 年前
/**
* @return bool
* @param array[byreference] $values
* @desc 将数组或任何值转换为标量对象 [尚未在大型规模上进行测试]
*/
function setobject(&$values) {
$values = (object) $values;
foreach ($values as $tkey => $val) {
if (is_array($val)) {
setobject($val);
$values->$tkey = $val;
}
}
return (bool) $values;
}
-2
ludvig dot ericson gmail.dot com
18 年前
致 matt
此函数接受一个参数,并不意味着你使用硬编码的东西,而是你可以让用户选择!\o/

作为框架的一部分或其他东西。

此外,你可能可以使用 call_user_func 调用它
-2
Skayo
7 年前
$foo = "1";
settype($foo, "bool");
var_dump($foo); // 输出:bool(true)

$bar = "0";
settype($bar, "bool");
var_dump($bar); // 输出:bool(false)
-5
Michael Benedict
18 年前
请注意,settype() 会初始化一个未定义的变量。因此,如果你想保留类型和值,你应该将 settype() 调用包装在 isset() 调用中。

<?php
settype
($foo, "integer");
echo(
"|$foo|");
?>

打印 "|0|",而不是 "||"。

要获得后者,请使用
<?php
if(isset($foo)) settype($foo, "integer");
echo(
"|$foo|");
?>
-3
marjune
7 年前
在布尔值中,除了 0 或 -0 之外的任何数字都被认为是真,除了 '0' 或 '' 之外的任何字符串也被认为是真。

<?php

$foo
= '0';
settype($foo, 'boolean');
var_dump($foo); // false

$foo = 0;
settype($foo, 'boolean');
var_dump($foo); // false
-7
Chris Sullins
14 年前
settype() 有一些非常奇怪且可能存在错误的行为。

正如 Michael Benedict 所指出的,对变量使用 settype() 将初始化该变量。更奇怪的是,对未初始化的变量使用 settype(),并将该变量视为数组或对象,也会初始化该变量。所以

<?php
settype
($foo->bar,"integer"); // stdClass Object ( [test] => 0 )
?>

这适用于任何长度的链:$foo->bar['baz']->etc

接下来我们看一下 $foo 已经被设置了会发生什么。

<?php
$foo
= false;
settype($foo->bar,"integer"); // stdClass Object ( [test] => 0 )
?>

就其本身而言,这可能不会有问题。它甚至可能是有意义的。但在所有其他情况下,只要 $foo 被定义,即使 (boolean) $foo === false,它也会抛出错误,除非 $foo->bar 是有效的(即 $foo 已经是对象)。

<?php
$foo
= true;
settype($foo->bar,"integer"); // Notice: Trying to get property of non-object
?>
To Top