PHP等价的。net / java 's toString()

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

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

$myText = $myVar . '';

就像Java或。net中的ToString()方法。

1514179 次浏览

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

$myText = "$myVar";

您总是可以创建一个名为.ToString($in)的方法来返回

$in . '';

如何转换PHP的值 变量转换为字符串?< / p >

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

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

你可以使用铸造运营商:

$myText = (string)$myVar;

PHP手册的字符串部分中有关于字符串强制转换的更多细节,包括对布尔值和空值的特殊处理。

如果转换的不是简单类型(如整数或布尔值),则需要为要转换的类型编写自己的函数/方法,否则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);

对于基本类型,只需使用(string)$var或直接打印该变量。PHP是动态类型的语言,变量会动态地转换为字符串。

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

您正在寻找strval:

# EYZ0

获取变量的字符串值。 参见有关字符串的文档 有关转换到的更多信息 字符串。< / p >

该函数不执行格式化 返回值。如果你是 正在寻找格式化数字的方法 值作为字符串,请参见 Sprintf()或number_format().

. /p> . /p> . /p> . /p> . /

你可以使用类型转换:

$var = (string)$varname;

或StringValue:

$var = strval($varname);

或SetType:

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

它们在类型杂耍方面的作用都是一样的。

使用# EYZ0:

$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);

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

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


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

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

双引号也可以……它应该创建一个字符串,然后它应该在两个空字符串之间APPEND/INSERT转换后的字符串值$myVar。

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

如果你跟随字符串强制转换手册的链接,有一个非常重要的特殊情况需要理解:

(string)强制转换更可取,特别是当变量美元一个是一个对象时,因为PHP将根据对象模型调用__toString () magic方法来遵循协议强制转换(如果在实例化$a的类中定义了该方法)。

PHP做了类似的事情

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

(字符串)强制转换操作是PHP5+编程中推荐的技术,可以使代码更加面向对象。在我看来,这是一个与其他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_rvar_dump):

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
< p >感谢: # EYZ0 < / em >

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

转换这样一个变量的尝试无法获得预期的字符串,因为变量被转换为8进制(八进制)

所有这些将使$str的值为32611:

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

您还可以使用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) . "'";

正如其他人所提到的,对象需要__toString方法来强制转换为字符串。没有定义该方法的对象仍然可以使用spl_object_hash函数生成字符串表示。

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

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

这对于调试变量初始化为Object的代码特别有帮助,稍后在代码中它被怀疑已经更改为不同的Object。简单地将变量回显到日志中就可以显示(或不显示)来自对象哈希的更改。

我认为这个问题有点误导人,因为, toString()在Java中不仅仅是一种将某些东西强制转换为String的方法。这就是铸造 via (string)或string . valueof()所做的,它在PHP中也同样有效
// Java
String myText = (string) myVar;


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

注意,这可能会有问题,因为Java是类型安全的(请看这里了解更多细节)。

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

Java 不只是将对象强制转换为字符串。相反,它将为您提供String表示形式中的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"
我说的“给出字符串表示”是什么意思?

  • 将该类转换为String将(默认情况下)将数据(这里是所有书籍)转换为字符串,因此String将非常长,而且大多数情况下也不是很有用。
  • To 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,而其他一些方法将在object上失败。查看PHP文档以了解更多细节。

__toString方法或(string)强制转换

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

可以将对象视为字符串


class Foo
{


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


}


echo new Foo(); //foo

还有另一个技巧,假设你有int变量,你想把它变成字符串


$string=''.$intvariable;

这在PHP中可能很困难,因为内部处理数据类型的方式不同。假设您指的不是对象或资源等复杂类型,则对字符串的泛型强制转换仍然可能导致不正确的转换。在某些情况下,甚至可能需要打包/解包,然后您仍然可能在字符串编码中遇到问题。我知道这听起来可能有点夸张,但在这些情况下,标准类型杂耍(如$myText = $my_var .'';$myText = (string)$my_var;)可能不起作用。否则,我会建议使用通用类型转换,或使用serialize()或json_encode(),但这同样取决于您计划对字符串做什么。

主要的区别在于,Java和. net在处理二进制数据和基本类型以及从特定类型转换到/从特定类型转换到字符串方面有更好的功能,即使对用户抽象了特定的情况也是如此。PHP的情况则完全不同,即使是处理十六进制也会让你摸不着头脑,直到你掌握了它。

我想不出更好的方法来回答这个问题,这是可比Java/。NET中的_toString()和这样的方法通常以特定于对象或数据类型的方式实现。在这种情况下,神奇的方法__toString()和__serialize()/__unserialize()可能是最好的比较。

还要记住,PHP没有基本数据类型的相同概念。从本质上讲,PHP中的每一种数据类型都可以被认为是一个对象,它们的内部处理程序试图使它们具有某种通用性,即使这意味着在将float转换为int时失去准确性。你不能像在Java中那样处理类型,除非你在本地扩展中使用它们的zvals。

虽然PHP用户空间没有将int、char、bool或float定义为对象,但所有内容都存储在一个zval结构中,它与C中可以找到的对象非常接近,具有用于在zval中处理数据的通用函数。在PHP中访问数据的每一种可能的方式都可以追溯到zval结构以及zend vm允许您处理数据的方式,而无需将它们转换为本机类型和结构。使用Java类型,可以更细粒度地访问它们的数据,并有更多的方法来操作它们,但也有更大的复杂性,因此有强类型和弱类型参数。

这些链接可能会有帮助:

https://www.php.net/manual/en/language.types.type-juggling.php # EYZ0 < / p >