PHP等同于.NET / Java的toString()


556

如何将PHP变量的值转换为字符串?

我在寻找比连接空字符串更好的东西:

$myText = $myVar . '';

就像ToString()Java或.NET中的方法一样。


6
这似乎是正确的答案:stackoverflow.com/a/3559247/11236print_r(foo, true))!
ripper234

我会用json_encode($myText)。我发现,建议的解决方案print_r(string)var工作以及对标量值和简单对象。对于复杂变量,类或对象(如果__toString()未定义完整),我更喜欢上述json_encode
埃里克·基加西

Answers:


791

您可以使用强制转换运算符

$myText = (string)$myVar;

PHP手册的“ 字符串”部分提供了有关字符串转换和转换的更多详细信息,包括对布尔值和null的特殊处理。


11
Object of class Foo could not be converted to string。是否有可以将任何内容(数组+对象+任何内容)转换为字符串的通用解决方案?
ripper234 2013年


2
注意:在数组上使用时,这会给PHP发出通知。
dave1010 2013年

29
@MarkAmery他给出了一个隐式调用__toString()“魔术方法” 的答案,但根本没有提及。用户要求提供类似于Java toString()方法的答案,而在PHP中,就是__toString()函数。
Supuhstar

2
@Supuhstar嗯,我终于明白了你来自哪里。对不起,如果我以前很钝。我同意这是一个相关的细节,添加它很有价值,也许可以将答案分为带有标题的“转换基元”和“转换对象”部分。
Mark Amery 2013年

309

这是通过类型转换完成的:

$strvar = (string) $var; // Casts to string
echo $var; // Will cast to string implicitly
var_dump($var); // Will show the true type of the variable

在一个类中,您可以使用magical方法定义输出的内容__toString。下面是一个示例:

class Bottles {
    public function __toString()
    {
        return 'Ninety nine green bottles';
    }
}

$ex = new Bottles;
var_dump($ex, (string) $ex);
// Returns: instance of Bottles and "Ninety nine green bottles"

其他一些类型转换示例:

$i = 1;

// int 1
var_dump((int) $i);

// bool true
var_dump((bool) $i);

// string "1"
var_dump((string) 1);

126

使用print_r

$myText = print_r($myVar,true);

您也可以像这样使用它:

$myText = print_r($myVar,true)."foo bar";

这将设置$myText为字符串,例如:

array (
  0 => '11',
)foo bar

使用var_export获取更多信息(带有变量类型,...):

$myText = var_export($myVar,true);

1
“当返回参数为TRUE时,[print_r]将返回一个字符串。” 由于print_r是打印对象,数组(以及数字/字符串)的一种好方法,因此它是将对象转换为人类可读的字符串的好方法。
Cedric's

1
仅供参考,这一true部分至关重要!我尝试了几种字符串转换方法,其中包括print_r,并对它们感到失望,然后我发现了该true参数(请阅读文档以了解其工作原理)。
ripper234

57

您可以使用类型转换:

$var = (string)$varname;

或StringValue:

$var = strval($varname);

或SetType:

$success = settype($varname, 'string');
// $varname itself becomes a string

在类型变戏法方面,它们都为同一件事工作。


strval($ varname)对我有用,特别是当值以“ variant”类型返回且需要转换为字符串或int时。
米兰

strval()是我寻找的原因,因为我想将其与一起使用array_walk。EG$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
巴特尔布特库斯


28

您正在寻找strval

string strval ( mixed $var )

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

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


3
这实际上非常有用,因为我想不使用自定义回调就将所有数字转换为字符串。$strings = array_map('strval', $my_numbers);
peterchaula

通常,这是唯一适用于array_mapand callables的答案。

18

对于基元,只需立即使用(string)$var或打印此变量。PHP是动态类型化的语言,并且变量将即时转换为字符串。

如果要将对象转换为字符串,则需要定义__toString()返回字符串的方法。禁止此方法引发异常。



11

我认为这是值得一提的是,你可以捕捉任何输出(如print_rvar_dump通过输出缓冲的变量):

<?php
    ob_start();
    var_dump($someVar);
    $result = ob_get_clean();
?>

由于: 如何捕获var_dump的结果到字符串?


1
值得一提的是,您不需要print_r。只需使用覆盖以字符串形式返回即可。
2014年

1
更好的方法是在$result = var_export($someVar, true)没有ob的情况下使用。

8

另一种选择是使用内置的settype函数:

<?php
$foo = "5bar"; // string
$bar = true;   // boolean

settype($foo, "integer"); // $foo is now 5   (integer)
settype($bar, "string");  // $bar is now "1" (string)
?>

实际上,与类型转换不同,这实际上对变量执行转换,并允许您具有转换为多种类型的一般方法。


8

除了Thomas G. Mayfield给出的答案外:

如果您按照字符串转换手册的链接进行操作,则有一种特殊情况对于理解这一点非常重要:

(string)强制转换更可取,尤其是在变量$ a是一个对象的情况下,因为PHP将通过调用__toString()魔术方法根据其对象模型遵循强制转换协议(如果在$ a实例化的类中定义了此类转换协议)。

PHP的作用类似于

function castToString($instance) 
{ 
    if (is_object($instance) && method_exists($instance, '__toString')) {
        return call_user_func_array(array($instance, '__toString'));
    }
}

(字符串)铸造操作是用于PHP5 +编程使代码更加面向对象的一个推荐的技术。IMO这是与其他OOP语言(如Java / C#/ etc)的设计相似性(差异)的一个很好的例子,即以其自己的特殊PHP方式(无论是好是贵)。


8

就像其他人提到的那样,对象需要一种__toString强制转换为字符串的方法。未定义该方法的对象仍可以使用spl_object_hash函数生成字符串表示形式。

此函数返回对象的唯一标识符。只要未破坏对象,此id可用作存储对象或标识对象的哈希键。一旦对象被销毁,其散列可用于其他对象。

我有一个基本的Object类,其__toString方法默认调用md5(spl_object_hash($this))以使输出清晰唯一,因为spl_object_hash的输出在对象之间看起来非常相似。

这对于调试将变量初始化为对象的代码,然后怀疑在代码中后来已更改为其他对象的代码特别有用。只需将变量回显到日志中,就可以显示出对象哈希(或没有)的变化。


6

如果预期的字符串变量的前导零(例如077543),则先前答案中的某些(如果不是全部)方法将失败

尝试转换此类变量的操作未能获得预期的字符串,因为该变量已转换为以8基数(八进制)

所有这些将使$str值成为32611

$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");

1
这是PICNIC(椅子上的问题,而不是计算机上的问题),因为这里没有任何故障print 077543;输出32611,因此这是的正确字符串值$no。没有人期望(string)+1返回字符串+1(正确返回1)或$no = 1+1; print (string)$no;输出1+1。注意:(1)十六进制($no=0xff;)也相同。(2)您可以使用'0'.decoct($no);(3)取回八进制值,$no="077543";保持0开头,“ 077543” + 1`给出,77544077543+1(正确)给出32612。(PS:没有错误,因为这个错误很常见)
Tino

4

我认为这个问题有点误导,因为Java中的toString()不仅仅是将某些内容转换为String的一种方式。这就是通过(string)或String.valueOf()进行强制转换的功能,并且在PHP中也能正常运行。

// Java
String myText = (string) myVar;

// PHP
$myText = (string) $myVar;

请注意,这可能是有问题的,因为Java是类型安全的(有关更多详细信息,请参见此处)。

但是正如我所说,这是强制转换,因此与Java的toString()等效。

Java 中的 toString 不仅将对象转换为String。相反,它将为您提供String表示形式。这就是PHP中的__toString()所做的。

// Java
class SomeClass{
    public String toString(){
        return "some string representation";
    }
}

// PHP
class SomeClass{
    public function __toString()
    {
        return "some string representation";
    }
}

从另一面来看:

// Java
new SomeClass().toString(); // "Some string representation"

// PHP
strval(new SomeClass); // "Some string representation"

“提供字符串表示形式”是什么意思?想象一下一个拥有数百万本书的图书馆的课堂。

  • 将该类强制转换为String会(默认情况下)会将数据(这里是所有书籍)转换为字符串,因此String会很长,而且大多数情况下也不太有用。
  • 改为使用String会给您String表示形式,即仅库的名称。这是较短的信息,因此为您提供的信息较少,但更为重要。

这些都是有效的方法,但目标却大相径庭,都不是针对每种情况的完美解决方案,您必须明智地选择最适合您需求的方法。

当然,还有更多选择:

$no = 421337  // A number in PHP
$str = "$no"; // In PHP, stuff inside "" is calculated and variables are replaced
$str = print_r($no, true); // Same as String.format();
$str = settype($no, 'string'); // Sets $no to the String Type
$str = strval($no); // Get the string value of $no
$str = $no . ''; // As you said concatenate an empty string works too

所有这些方法都将返回一个String,其中一些内部使用__toString,而另一些将在Objects上失败。看看PHP文档以了解更多详细信息。



1

双引号也应该起作用...它应该创建一个字符串,然后应该在2个空字符串之间追加/插入$ myVar的强制转换STRING值。


1

您始终可以创建一个名为.ToString($ in)的方法,该方法返回

$in . '';  

1

如果要转换除整数或布尔值之类的简单类型以外的任何内容,则需要为要转换的类型编写自己的函数/方法,否则PHP只会打印该类型(例如数组,GoogleSniffer或坐浴盆)。


1

PHP是动态类型的,因此就像Chris Fournier所说的那样:“如果像字符串一样使用它,它将变成字符串”。如果您正在寻找对字符串格式的更多控制,那么printf是您的答案。



1
$parent_category_name = "new clothes & shoes";

// To make it to string option one
$parent_category = strval($parent_category_name);

// Or make it a string by concatenating it with 'new clothes & shoes'
// It is useful for database queries
$parent_category = "'" . strval($parent_category_name) . "'";

不好意思,因为我真的不知道您想告诉我们什么。strval()在字符串上使用只是浪费时间。
蒂诺

这件事是假设您获取了一个字符串值=当重新表示该字符串值时,它将是“字符串”。但是,当您想在javascript中显示该字符串时,需要将其设为“ stringx”
Daniel Adenew

这是非常危险的(更不用说:完全错误)。请查看stackoverflow.com/q/168214stackoverflow.com/q/23740548,以了解如何安全地将内容从PHP传递给JS!(对不起,有点抱歉:将PHP变量传递给JS并不是问题的一部分。)
Tino

0

对于对象,您可能无法使用强制转换运算符。相反,我使用该json_encode()方法。

例如,以下内容将内容输出到错误日志:

error_log(json_encode($args));

0

尝试使用这种奇怪但可行的方法将stdClass的文本部分转换为字符串类型:

$my_std_obj_result = $SomeResponse->return->data; // Specific to object/implementation

$my_string_result = implode ((array)$my_std_obj_result); // Do conversion

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.