PHP中与.NET/Java的toString()等效的方法

566

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

我想寻找比用空字符串拼接更好的方法:


$myText = $myVar . '';

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


2
我会使用 json_encode($myText)。我发现建议的解决方案 print_r(string)var 对于标量值和简单对象效果很好。对于复杂变量、类或对象,如果没有定义完整的 __toString(),我更喜欢前面提到的 json_encode - Eric Kigathi
26个回答

7
除了Thomas G. Mayfield给出的答案外:
如果您跟随字符串转换手册上的链接,就会发现一个特殊情况,这是非常重要的:
(string) 转换更可取,特别是当您的变量 $a 是一个对象时,因为 PHP 将根据其对象模型调用 __toString() 魔术方法(如果在实例化 $a 的类中定义了该方法),并遵循转换 protocol
PHP 执行类似于以下操作:
function castToString($instance) 
{ 
    if (is_object($instance) && method_exists($instance, '__toString')) {
        return call_user_func_array(array($instance, '__toString'));
    }
}

(string)强制转换操作是PHP5+编程中推荐的技术,使代码更加面向对象。在我看来,这是与其他面向对象语言(如Java/C#/等)设计上相似(不同)的一个很好的例子,即以其自己特有的PHP方式实现(无论是为了好还是坏)。


7
正如其他人所提到的,对象需要一个__toString方法才能被转换为字符串。如果一个对象没有定义这个方法,仍然可以使用spl_object_hash函数来产生一个字符串表示。

这个函数返回对象的唯一标识符。这个id可以用作存储对象的哈希键,或者用于标识一个对象,只要对象没有被销毁。一旦对象被销毁,它的哈希可能会被重用于其他对象。

我有一个基础Object类,其中包含一个__toString方法,默认调用md5(spl_object_hash($this))使输出明显独特,因为spl_object_hash的输出在对象之间看起来非常相似。
这对于调试代码特别有帮助,当一个变量初始化为一个Object,并且在代码后期怀疑它已经改变为另一个Object时,简单地将变量输出到日志中可以通过对象哈希(或者不是)来揭示变化。

7
我认为这个问题有些误导,因为在Java中,toString()不仅仅是将某物转换为字符串的方法。这就是casting通过(string)执行的操作,在PHP中同样适用。
// Java
String myText = (string) myVar;

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

请注意,这可能会成为问题,因为Java是类型安全的(有关更多详细信息,请参见此处)。
但正如我所说,这是强制转换,因此不等同于Java的toString()。
Java中的toString()不仅仅是将对象强制转换为字符串。它实际上会给你一个字符串表示形式。而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"

我所说的“给出字符串表示”是什么意思? 想象一个拥有数百万本书的图书馆类。 将该类强制转换为字符串会(默认情况下)将数据,即所有书籍,转换为字符串,因此字符串会非常长,大多数时候并不是很有用。 相反,使用ToString方法将会给你字符串表示,即只有图书馆的名称。这样更短,因此给出了更少但更重要的信息。 这两种方法都是有效的,但目标非常不同,没有一种解决方案适用于每种情况,您必须明智地选择哪种更适合您的需求。 当然,还有更多选项:
$no = 421337  // A number in PHP
$str = "$no"; // In PHP, the 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

所有这些方法都将返回一个字符串,其中一些内部使用__toString,而另一些则会在对象上失败。请查看PHP文档以获取更多详细信息。

6

在之前的回答中,一些甚至所有的方法在意图转换的字符串变量有一个前导零(例如077543)时会失败。

尝试转换这样的变量无法得到预期的字符串,因为该变量被转换为八进制(base 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";保留前导零,“077543+1”给出77544,而077543+1(正确地)给出32612。(PS:由于这个错误很常见,所以没有被downvote) - Tino

3
文档说明您也可以执行以下操作:
$str = "$foo";

这与类型转换(cast)相同,但我认为它更美观。

来源:


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() 只是浪费时间。 - Tino
兄弟,问题是假设你收到一个字符串值=当它被表示时,它将是“the string”。但是,当你想在JavaScript中显示它时,你需要将它变成'stringx'。 - Nickromancer
这是极其危险的(甚至可以说是错误的)。请查看 https://dev59.com/xnVC5IYBdhLWcg3w1E7w 或 https://dev59.com/C2Ag5IYBdhLWcg3wU5gS,以了解如何安全地将 PHP 中的内容传递到 JS!(对于有些偏题:将 PHP 变量传递给 JS 不是问题的一部分。) - Tino

1

1

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

$in . '';  

1

如果你要转换的不是像整数或布尔值这样的简单类型,那么你需要为你要转换的类型编写自己的函数/方法,否则PHP将只打印类型(例如数组、GoogleSniffer或Bidet)。


1

PHP是动态类型的,就像Chris Fournier所说的那样,“如果你将其用作字符串,它就变成了字符串”。如果您想更好地控制字符串的格式,那么printf就是您的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接