Answers:
Object of class Foo could not be converted to string
。是否有可以将任何内容(数组+对象+任何内容)转换为字符串的通用解决方案?
__toString()
“魔术方法” 的答案,但根本没有提及。用户要求提供类似于Java toString()
方法的答案,而在PHP中,就是__toString()
函数。
这是通过类型转换完成的:
$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);
使用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);
true
部分至关重要!我尝试了几种字符串转换方法,其中包括print_r
,并对它们感到失望,然后我发现了该true
参数(请阅读文档以了解其工作原理)。
您可以使用类型转换:
$var = (string)$varname;
或StringValue:
$var = strval($varname);
或SetType:
$success = settype($varname, 'string');
// $varname itself becomes a string
在类型变戏法方面,它们都为同一件事工作。
strval()
是我寻找的原因,因为我想将其与一起使用array_walk
。EG$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
您正在寻找strval:
string strval ( mixed $var )
获取变量的字符串值。有关转换为字符串的更多信息,请参见有关字符串的文档。
此函数不对返回值进行格式化。如果您正在寻找一种将数字值格式化为字符串的方法,请参见sprintf()或number_format()。
$strings = array_map('strval', $my_numbers);
array_map
and callables的答案。
对于基元,只需立即使用(string)$var
或打印此变量。PHP是动态类型化的语言,并且变量将即时转换为字符串。
如果要将对象转换为字符串,则需要定义__toString()
返回字符串的方法。禁止此方法引发异常。
用双引号将其工作:
$myText = "$myVar";
除了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方式(无论是好是贵)。
就像其他人提到的那样,对象需要一种__toString
强制转换为字符串的方法。未定义该方法的对象仍可以使用spl_object_hash函数生成字符串表示形式。
此函数返回对象的唯一标识符。只要未破坏对象,此id可用作存储对象或标识对象的哈希键。一旦对象被销毁,其散列可用于其他对象。
我有一个基本的Object类,其__toString
方法默认调用md5(spl_object_hash($this))
以使输出清晰唯一,因为spl_object_hash的输出在对象之间看起来非常相似。
这对于调试将变量初始化为对象的代码,然后怀疑在代码中后来已更改为其他对象的代码特别有用。只需将变量回显到日志中,就可以显示出对象哈希(或没有)的变化。
如果预期的字符串变量的前导零(例如077543),则先前答案中的某些(如果不是全部)方法将失败。
尝试转换此类变量的操作未能获得预期的字符串,因为该变量已转换为以8为基数(八进制)。
所有这些将使$str
值成为32611:
$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");
我认为这个问题有点误导,因为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"
“提供字符串表示形式”是什么意思?想象一下一个拥有数百万本书的图书馆的课堂。
这些都是有效的方法,但目标却大相径庭,都不是针对每种情况的完美解决方案,您必须明智地选择最适合您需求的方法。
当然,还有更多选择:
$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文档以了解更多详细信息。
双引号也应该起作用...它应该创建一个字符串,然后应该在2个空字符串之间追加/插入$ myVar的强制转换STRING值。
PHP是动态类型的,因此就像Chris Fournier所说的那样:“如果像字符串一样使用它,它将变成字符串”。如果您正在寻找对字符串格式的更多控制,那么printf是您的答案。
您也可以使用var_export PHP函数。
$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()
在字符串上使用只是浪费时间。
我使用variableToString。它处理每种PHP类型,并且很灵活(可以根据需要扩展它)。
print_r(foo, true)
)!