提问人:Antoine Aubry 提问时间:8/26/2008 最后编辑:DarkMukkeAntoine Aubry 更新时间:2/26/2023 访问量:1516523
PHP 相当于 .NET/Java 的 toString()
PHP equivalent of .NET/Java's toString()
问:
如何将 PHP 变量的值转换为字符串?
我一直在寻找比用空字符串连接更好的东西:
$myText = $myVar . '';
就像 Java 或 .NET 中的方法一样。ToString()
答:
把它放在双引号里应该可以工作:
$myText = "$myVar";
评论
您始终可以创建名为 的方法。ToString($in) 返回
$in . '';
如何转换 PHP 的值 变量到字符串?
可以使用 (string) cast 或 strval() 函数将值转换为字符串。(编辑:正如托马斯所说)。
当您将其用作字符串时,它也应该自动为您强制转换。
您可以使用强制转换运算符:
$myText = (string)$myVar;
PHP 手册的 Strings 部分提供了有关字符串转换和转换的更多详细信息,包括对布尔值和 null 值的特殊处理。
评论
Object of class Foo could not be converted to string
.有没有可以将任何内容(数组+对象+其他)转换为字符串的通用解决方案?
__toString()
toString()
__toString()
如果你要转换除整数或布尔值等简单类型以外的任何类型,你需要为你尝试转换的类型编写自己的函数/方法,否则 PHP 只会打印类型(如数组、GoogleSniffer 或 Bidet)。
PHP是动态类型的,所以就像Chris Fournier说的那样,“如果你像字符串一样使用它,它就会变成一个字符串”。如果您正在寻找对字符串格式的更多控制,那么 printf 就是您的答案。
这是通过类型转换完成的:
$strvar = (string) $var; // Casts to string
echo $var; // Will cast to string implicitly
var_dump($var); // Will show the true type of the variable
在类中,可以使用神奇的方法__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);
对于基元,只需立即使用或打印此变量即可。PHP 是动态类型语言,变量将动态转换为字符串。(string)$var
如果要将对象转换为字符串,则需要定义返回字符串的方法。此方法禁止抛出异常。__toString()
您正在寻找 strval:
string strval ( mixed $var )
获取变量的字符串值。 请参阅有关字符串的文档 有关转换为 字符串。
此函数不执行格式设置 在返回值上。如果你是 寻找一种格式化数字的方法 value 作为字符串,请参阅 sprintf() 或 number_format()。
评论
$strings = array_map('strval', $my_numbers);
array_map
您可以使用类型转换:
$var = (string)$varname;
或者 StringValue:
$var = strval($varname);
或者 SetType:
$success = settype($varname, 'string');
// $varname itself becomes a string
它们在类型杂耍方面都为同一件事工作。
评论
strval()
是我正在寻找的,因为我想将它与.例如array_walk
$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
使用print_r:
$myText = print_r($myVar,true);
您也可以像以下方式使用它:
$myText = print_r($myVar,true)."foo bar";
这将设置为一个字符串,例如:$myText
array (
0 => '11',
)foo bar
使用 var_export 获取更多信息(使用 variable,... 类型):
$myText = var_export($myVar,true);
评论
true
print_r
true
另一种选择是使用内置的 settype 函数:
<?php
$foo = "5bar"; // string
$bar = true; // boolean
settype($foo, "integer"); // $foo is now 5 (integer)
settype($bar, "string"); // $bar is now "1" (string)
?>
与类型转换不同,这实际上对变量执行转换,并允许您使用转换为多种类型的通用方法。
双引号也应该有效......它应该创建一个字符串,然后它应该在 2 个空字符串之间 APPEND/INSERT $myVar 的强制转换 STRING 值。
除了托马斯·梅菲尔德(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#/等)的设计相似性(差异),即以它自己特殊的 PHP 方式(无论何时是好的或有价值的)。
对于对象,您可能无法使用强制转换运算符。相反,我使用该方法。json_encode()
例如,以下内容会将内容输出到错误日志:
error_log(json_encode($args));
文档说你也可以做:
$str = "$foo";
它和演员一样,但我认为它看起来更漂亮。
源:
尝试这种有点奇怪但有效的方法,将 stdClass 的文本部分转换为字符串类型:
$my_std_obj_result = $SomeResponse->return->data; // Specific to object/implementation
$my_string_result = implode ((array)$my_std_obj_result); // Do conversion
我认为值得一提的是,您可以使用输出缓冲来捕获变量中的任何输出(如 , ):print_r
var_dump
<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
评论
$result = var_export($someVar, true)
当预期的字符串变量具有前导零时,前面答案中的某些(如果不是全部)方法会失败,例如 077543。
尝试转换此类变量时无法获取预期的字符串,因为该变量已转换为基数 8(八进制)。
所有这些将使值为 32611:$str
$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");
评论
print 077543;
32611
$no
(string)+1
+1
1
$no = 1+1; print (string)$no;
1+1
$no=0xff;
'0'.decoct($no);
$no="077543";
0
77544
077543+1
32612
您还可以使用 var_export PHP 函数。
我使用 variableToString。它可以处理所有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()
正如其他人所提到的,对象需要一个方法被强制转换为字符串。未定义该方法的对象仍可使用 spl_object_hash 函数生成字符串表示形式。__toString
此函数返回对象的唯一标识符。此 ID 可用作用于存储对象或标识对象的哈希键,只要对象未被销毁即可。一旦对象被销毁,其哈希值可能会重新用于其他对象。
我有一个 Object 基类,其方法默认为 call,以使输出明显唯一,因为 spl_object_hash 的输出在对象之间看起来非常相似。__toString
md5(spl_object_hash($this))
这对于调试代码特别有用,其中变量初始化为 Object,稍后在代码中怀疑它已更改为其他 Object。只需将变量回显到日志中,就可以显示对象哈希的变化(或不)。
我认为这个问题有点误导,因为, Java 中的 toString() 不仅仅是一种将某些内容转换为 String 的方法。这就是通过(字符串)进行强制转换的作用,它在 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 将很长,并且大多数时候不是很有用。
- 相反,To String 将为您提供 String 表示形式,即仅提供库的名称。这更短,因此为您提供的信息更少,但更重要。
这些都是有效的方法,但目标却截然不同,都不是适合每种情况的完美解决方案,您必须明智地选择更适合您需求的方法。
当然,还有更多选择:
$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
所有这些方法都将返回一个 String,其中一些在内部使用 __toString,而另一些则在 Object 上失败。有关更多详细信息,请查看 PHP 文档。
__toString方法或(字符串)强制转换
$string=(string)$variable; //force make string
您可以将对象视为字符串
class Foo
{
public function __toString()
{
return "foo";
}
}
echo new Foo(); //foo
另外,还有另一个技巧,ı 假设 ı 有 int 变量 ı 想让它字符串
$string=''.$intvariable;
这在 PHP 中可能很困难,因为数据类型在内部处理的方式。假设您不是指复杂类型(如对象或资源),则对字符串的泛型强制转换仍可能导致不正确的转换。在某些情况下,甚至可能需要打包/解包,然后您仍然有可能出现字符串编码问题。我知道这听起来可能有点牵强,但这些是标准类型杂耍(例如 and(和类似))可能不起作用的情况。否则,我会建议使用通用强制转换,或使用 serialize() 或 json_encode(),但这同样取决于您计划对字符串执行的操作。$myText = $my_var .'';
$myText = (string)$my_var;
主要区别在于,Java 和 .NET 在处理二进制数据和基元类型方面具有更好的功能,并且可以与特定类型相互转换,然后从那里转换为字符串,即使特定情况从用户那里抽象出来也是如此。对于PHP来说,情况就不同了,即使处理十六进制也会让你摸不着头脑,直到你掌握了它的窍门。
我想不出更好的方法来回答这个问题,它与 Java/.NET 相当,其中 _toString() 和此类方法通常以特定于对象或数据类型的方式实现。这样一来,魔术方法 __toString() 和 __serialize()/__unserialize() 可能是最好的比较。
还要记住,PHP 没有相同的原始数据类型概念。从本质上讲,PHP 中的每个数据类型都可以被视为一个对象,它们的内部处理程序试图使它们在某种程度上具有通用性,即使这意味着失去准确性,例如将浮点数转换为 int 时。你不能像在 Java 中那样处理类型,除非你在本机扩展中使用它们的 zval。
虽然 PHP 用户空间没有将 int、char、bool 或 float 定义为对象,但所有内容都存储在 zval 结构中,该结构与 C 语言中的对象非常接近,具有用于处理 zval 中数据的通用函数。在 PHP 中访问数据的每一种可能方法都归结为 zval 结构,以及 zend vm 允许您在不将它们转换为本机类型和结构的情况下处理它们的方式。使用 Java 类型,您可以更精细地访问它们的数据,并有更多方法来操作它们,但也具有更大的复杂性,因此存在强类型与弱类型参数。
这些链接对我有帮助:
https://www.php.net/manual/en/language.types.type-juggling.php https://www.php.net/manual/en/language.oop5.magic.php
上一个:努力结束循环比较字符串
评论
json_encode($myText)
print_r
(string)var
__toString()
json_encode