PHP 大会日本 2024

strval

(PHP 4、PHP 5、PHP 7、PHP 8)

strval获取变量的字符串值

描述

strval(混合 $value): 字符串

获取变量的字符串值。有关转换为字符串的更多信息,请参阅 字符串 的文档。

此函数对返回的值不执行任何格式化。如果您正在寻找一种将数值格式化为字符串的方法,请参阅 sprintf()number_format()

参数

value

要转换为 字符串 的变量。

value 可以是任何标量类型、NULL 或实现 __toString() 方法的 对象。您不能对数组或未实现 __toString() 方法的对象使用 strval()

返回值

value字符串 值。

示例

示例 #1 使用 PHP 魔术 __toString() 方法的 strval() 示例。

<?php
class StrValTest
{
public function
__toString()
{
return
__CLASS__;
}
}

// 输出 'StrValTest'
echo strval(new StrValTest);
?>

参见

添加注释

用户贡献的注释 7 个注释

Mark Clements
8 年前
关于此函数如何随时间推移而发生变化的一些说明,关于以下语句

> 您不能对数组或对象使用 strval()
> 未实现 __toString() 方法。

== 数组 ==

在 PHP 5.3 及以下版本中,strval(array(1, 2, 3)) 将返回字符串“Array”,而不会发生任何错误。

从 5.4 及更高版本开始,返回值保持不变,但您现在会收到一个通知级别的错误:“Array to string conversion”。

== 对象 ==

对于未实现 __toString() 的对象,行为有所不同

PHP 4:“Object”
PHP 5 < 5.2:“Object id #1”(数字显然会发生变化)
PHP >= 5.2:可捕获的致命错误:无法将类 X 的对象转换为字符串
Hayley Watson
17 年前
从 PHP 5.2 开始,strval() 将返回对象的字符串值,调用其 __toString() 方法来确定该值是什么。
Tom Nicholson
20 年前
如果您想将整数转换为英文单词字符串,例如 29 -> twenty-nine,那么这里有一个函数可以做到这一点。

关于 fmod() 的使用说明
我使用了浮点数 fmod() 而不是 % 运算符,因为 % 会将操作数转换为 int,从而破坏 [-2147483648, 2147483647] 范围之外的值。

我没有费心处理“billion”,因为这个词的意思是 10e9 或 10e12,具体取决于你问的是谁。

如果参数不表示整数,则该函数返回“#”。

<?php
$nwords
= array( "零", "一", "二", "三", "四", "五", "六", "七",
"八", "九", "十", "十一", "十二", "十三",
"十四", "十五", "十六", "十七", "十八",
"十九", "二十", 30 => "三十", 40 => "四十",
50 => "五十", 60 => "六十", 70 => "七十", 80 => "八十",
90 => "九十" );

function
int_to_words($x) {
global
$nwords;

if(!
is_numeric($x))
$w = '#';
else if(
fmod($x, 1) != 0)
$w = '#';
else {
if(
$x < 0) {
$w = '负 ';
$x = -$x;
} else
$w = '';
// ... 现在 $x 是一个非负整数。

if($x < 21) // 0 到 20
$w .= $nwords[$x];
else if(
$x < 100) { // 21 到 99
$w .= $nwords[10 * floor($x/10)];
$r = fmod($x, 10);
if(
$r > 0)
$w .= '-'. $nwords[$r];
} else if(
$x < 1000) { // 100 到 999
$w .= $nwords[floor($x/100)] .' 百";
$r = fmod($x, 100);
if(
$r > 0)
$w .= ' 零". int_to_words($r);
} else if(
$x < 1000000) { // 1000 到 999999
$w .= int_to_words(floor($x/1000)) .' 千";
$r = fmod($x, 1000);
if(
$r > 0) {
$w .= ' ';
if(
$r < 100)
$w .= '零";
$w .= int_to_words($r);
}
} else {
// 百万
$w .= int_to_words(floor($x/1000000)) .' 百万";
$r = fmod($x, 1000000);
if(
$r > 0) {
$w .= ' ';
if(
$r < 100)
$word .= '零";
$w .= int_to_words($r);
}
}
}
return
$w;
}

?>

用法
<?php
echo '当前有 '. int_to_words($count) . ' 位成员登录。';
?>
php at ianco dot co dot uk
19 年前
我无法理解为什么

(string)"0" == (string)"0.00"

会评估为真。对于 strval 和单引号也是一样。
=== 可以避免这种情况。

为什么这很重要?我的一个供应商,令人难以置信的是,在他们的库存文件中使用 0 表示标准折扣,使用 0.00 表示无折扣。
kendsnyder+phpnet at gmail dot com
17 年前
将大浮点数转换为字符串的唯一方法是使用 printf('%0.0f',$float); 而不是 strval($float); (php 5.1.4)。

// strval() 会在 pow(2,45) 附近丢失数字;
echo pow(2,50); // 1.1258999068426E+015
echo (string)pow(2,50); // 1.1258999068426E+015
echo strval(pow(2,50)); // 1.1258999068426E+015

// 全转换
printf('%0.0f',pow(2,50)); // 112589906846624
echo sprintf('%0.0f',pow(2,50)); // 112589906846624
NyctoFixer at gmail dot com
17 年前
从 PHP 5.1.4 开始(我在更高版本中没有测试过),strval 函数在遇到对象时不会尝试调用 __toString 方法。这个简单的包装函数将为您处理这种情况

<?

/**
* 返回变量的字符串值
*
* 这与 strval 不同,因为它会在给定对象时调用 __toString
* 并且对象具有该方法
*/
function stringVal ($value)
{
// 我们使用 get_class_methods 而不是 method_exists 来确保 __toString 是一个公共方法
if (is_object($value) && in_array("__toString", get_class_methods($value)))
return strval($value->__toString());
else
return strval($value);
}

?>
Steve Ball
19 年前
似乎一个被视为无符号大整数(32 位),另一个被视为有符号大整数(已翻转/下溢)。

2326201276 - (-1968766020) = 4294967296.
To Top