PHP 相当于 .NET/Java 的 toString()

PHP equivalent of .NET/Java's toString()

提问人:Antoine Aubry 提问时间:8/26/2008 最后编辑:DarkMukkeAntoine Aubry 更新时间:2/26/2023 访问量:1516523

问:

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

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

$myText = $myVar . '';

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

PHP 字符串

评论

2赞 Eric Kigathi 1/13/2019
我会用.我发现建议的解决方案适用于标量值和简单对象。对于复杂的变量、类或对象,如果没有定义完整的,我更喜欢前面提到的。json_encode($myText)print_r(string)var__toString()json_encode

答:

15赞 Mark Biek 8/26/2008 #1

把它放在双引号里应该可以工作:

$myText = "$myVar";

评论

0赞 Antoine Aubry 9/15/2012
这可行,但我不知道这是否是PHP中的标准方法。
0赞 Yauhen Yakimovich 3/12/2013
这是在 bash 中执行此操作的一种非常标准的方法
0赞 Levent Yumerov 2/21/2017
如果 $myVar 是具有 __toString 或标量类型的类对象,则此方法将起作用。在其他情况下,会生成错误。
1赞 Joel Coehoorn 8/26/2008 #2

您始终可以创建名为 的方法。ToString($in) 返回

$in . '';  
34赞 Chris 8/26/2008 #3

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

可以使用 (string) caststrval() 函数将值转换为字符串。(编辑:正如托马斯所说)。

当您将其用作字符串时,它也应该自动为您强制转换。

789赞 2 revsTom Mayfield #4

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

$myText = (string)$myVar;

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

评论

14赞 ripper234 1/3/2013
Object of class Foo could not be converted to string.有没有可以将任何内容(数组+对象+其他)转换为字符串的通用解决方案?
3赞 ripper234 1/4/2013
这就是答案——stackoverflow.com/questions/28098/php-tostring-equivalent/......
2赞 dave1010 2/13/2013
注意:当用于数组时,这将给出 PHP 通知。
29赞 Ky - 4/9/2013
@MarkAmery 他给出了一个含蓄地称之为“魔法方法”的答案,但根本没有提到这一点。用户要求一个类似于 Java 方法的答案,在 PHP 中,这就是函数。__toString()toString()__toString()
2赞 Mark Amery 4/11/2013
@Supuhstar啊,对了,我终于明白你从哪里来了。对不起,如果我以前迟钝了。我同意这是一个相关的细节,添加它会很有价值,也许将答案分成带有标题的“转换基元”和“转换对象”部分。
1赞 Brian Warshaw 8/26/2008 #5

如果你要转换除整数或布尔值等简单类型以外的任何类型,你需要为你尝试转换的类型编写自己的函数/方法,否则 PHP 只会打印类型(如数组、GoogleSniffer 或 Bidet)。

1赞 Allain Lalonde 8/26/2008 #6

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

312赞 Ross 8/26/2008 #7

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

$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);
18赞 Michał Niedźwiedzki 8/26/2008 #8

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

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

28赞 opensas 12/20/2009 #9

您正在寻找 strval

string strval ( mixed $var )

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

此函数不执行格式设置 在返回值上。如果你是 寻找一种格式化数字的方法 value 作为字符串,请参阅 sprintf() 或 number_format()。

评论

3赞 Peter Chaula 6/8/2017
这实际上非常有用,因为我想在不使用自定义回调的情况下将所有数字转换为字符串。$strings = array_map('strval', $my_numbers);
0赞 Danon 10/4/2018
这是通常适用于字符串可调用对象的唯一答案。array_map
58赞 Joel Larson 1/2/2010 #10

您可以使用类型转换:

$var = (string)$varname;

或者 StringValue:

$var = strval($varname);

或者 SetType:

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

它们在类型杂耍方面都为同一件事工作。

评论

0赞 Milan 2/27/2014
strval($varname) 为我提供了诀窍,尤其是当值以“variant”类型返回并且需要转换为字符串或 int 时。
0赞 Buttle Butkus 4/19/2014
strval()是我正在寻找的,因为我想将它与.例如array_walk$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
126赞 Cedric 8/25/2010 #11

使用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);

评论

2赞 Cedric 9/1/2010
“当返回参数为 TRUE 时,[print_r] 将返回一个字符串。”由于print_r是打印对象、数组(以及数字/字符串)的好方法,因此它是将对象转换为人类可读字符串的好方法。
1赞 ripper234 1/4/2013
仅供参考,新人,这部分是必不可少的!我尝试了几种字符串转换方法,包括对所有这些方法感到失望,然后我发现了该参数(阅读文档了解它为什么有效)。trueprint_rtrue
7赞 Justin Weeks 3/7/2011 #12

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

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

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

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

1赞 Flak DiNenno 8/1/2011 #13

双引号也应该有效......它应该创建一个字符串,然后它应该在 2 个空字符串之间 APPEND/INSERT $myVar 的强制转换 STRING 值。

7赞 Yauhen Yakimovich 5/7/2012 #14

除了托马斯·梅菲尔德(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 方式(无论何时是好的或有价值的)。

0赞 Archimedes Trajano 4/4/2013 #15

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

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

error_log(json_encode($args));
3赞 DarthKotik 11/16/2013 #16

文档说你也可以做:

$str = "$foo";

它和演员一样,但我认为它看起来更漂亮。

源:

0赞 mikikg 2/25/2014 #17

尝试这种有点奇怪但有效的方法,将 stdClass 的文本部分转换为字符串类型:

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

$my_string_result = implode ((array)$my_std_obj_result); // Do conversion
11赞 Daan 2/26/2014 #18

我认为值得一提的是,您可以使用输出缓冲来捕获变量中的任何输出(如 , ):print_rvar_dump

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

感谢:如何捕获字符串var_dump结果?

评论

1赞 ars265 6/18/2014
值得一提的是,print_r不需要它。只需使用重写以字符串形式返回即可。
1赞 Danon 10/4/2018
更好的方法是在没有 ob 的情况下使用。$result = var_export($someVar, true)
6赞 user1587439 5/19/2014 #19

当预期的字符串变量具有前导零时,前面答案中的某些(如果不是全部)方法会失败,例如 077543

尝试转换此类变量时无法获取预期的字符串,因为该变量已转换为基数 8(八进制)。

所有这些将使值为 32611$str

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

评论

1赞 Tino 8/31/2017
这是野餐(椅子上有问题,而不是电脑上的问题),因为这里没有什么问题! 输出,所以这是 的正确字符串值。没有人期望返回字符串(它正确返回)或输出。注:(1)十六进制()也相同。(2)你可以用(3)保持前导,“077543”+1'给出,而(正确)给出。(PS:不投反对票,因为这个错误很常见)print 077543;32611$no(string)+1+11$no = 1+1; print (string)$no;1+1$no=0xff;'0'.decoct($no);$no="077543";077544077543+132612
1赞 Aby W 8/11/2015 #20

您还可以使用 var_export PHP 函数。

-1赞 ling 10/28/2015 #21

我使用 variableToString。它可以处理所有PHP类型,并且非常灵活(如果需要,可以扩展它)。

1赞 Develop4Life 6/9/2016 #22
$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) . "'";

评论

0赞 Tino 8/31/2017
投了反对票,因为我真的不知道你想告诉我们什么。在字符串上使用完全是浪费时间。strval()
0赞 Develop4Life 9/4/2017
伙计,事情是假设你背诵了一个字符串值 = 当它被确认时,它将是“字符串”。但是,当你想在javascript中显示它时,你需要把它设为'stringx''
0赞 Tino 9/7/2017
这是极其危险的(不是说:完全错误)。请查看 stackoverflow.com/q/168214stackoverflow.com/q/23740548,了解如何安全地将某些内容从 PHP 传递到 JS!(对不起,有点跑题了:将 PHP var 传递给 JS 不是问题的一部分。
7赞 jimp 9/1/2016 #23

正如其他人所提到的,对象需要一个方法被强制转换为字符串。未定义该方法的对象仍可使用 spl_object_hash 函数生成字符串表示形式。__toString

此函数返回对象的唯一标识符。此 ID 可用作用于存储对象或标识对象的哈希键,只要对象未被销毁即可。一旦对象被销毁,其哈希值可能会重新用于其他对象。

我有一个 Object 基类,其方法默认为 call,以使输出明显唯一,因为 spl_object_hash 的输出在对象之间看起来非常相似。__toStringmd5(spl_object_hash($this))

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

7赞 Xanlantos 12/21/2018 #24

我认为这个问题有点误导,因为, 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 文档

0赞 dılo sürücü 10/13/2020 #25

__toString方法或(字符串)强制转换

$string=(string)$variable;  //force make string 

您可以将对象视为字符串


class Foo
{

  public function __toString()
  {
     return "foo";
  }

}

echo new Foo(); //foo

另外,还有另一个技巧,ı 假设 ı 有 int 变量 ı 想让它字符串


$string=''.$intvariable;
0赞 JSON 6/23/2022 #26

这在 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