您可以使用 casting operators:
$myText = (string)$myVar;
PHP 手册的 Strings section 中有更多关于字符串转换和转换的详细信息,包括对布尔值和空值的特殊处理。
这是通过类型转换完成的:
$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);
使用 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;
或字符串值:
$var = strval($varname);
或设置类型:
$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)
如何将 PHP 变量的值转换为字符串?
可以使用 (string) cast 或 strval() 函数将值转换为字符串。 (编辑:如 Thomas 所述)。
当您将它用作字符串时,它也应该自动为您转换。
您正在寻找 strval:
string strval (mixed $var) 获取变量的字符串值。有关转换为字符串的更多信息,请参阅有关字符串的文档。此函数对返回的值不执行任何格式设置。如果您正在寻找一种将数值格式化为字符串的方法,请参阅 sprintf() 或 number_format()。
$strings = array_map('strval', $my_numbers);
array_map
和一般字符串可调用对象的答案。
对于原语,只需使用 (string)$var
或立即打印此变量。 PHP 是动态类型语言,变量将被动态转换为字符串。
如果要将对象转换为字符串,则需要定义返回字符串的 __toString()
方法。该方法禁止抛出异常。
将其放在双引号中应该可以:
$myText = "$myVar";
我认为值得一提的是,您可以使用输出缓冲在变量中捕获任何输出(如 print_r
、var_dump
):
<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
感谢:How can I capture the result of var_dump to a string?
$result = var_export($someVar, 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)
?>
与类型转换不同,这实际上对变量执行转换,并允许您有一种转换为多种类型的通用方法。
除了 Thomas G. Mayfield 给出的答案:
如果您按照字符串转换手册的链接,有一个特殊情况非常重要,需要理解:
(string) cast 是更可取的,特别是如果您的变量 $a 是一个对象,因为 PHP 将通过调用 __toString() 魔法根据其对象模型遵循转换 protocol方法(如果在实例化 $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 方式(无论是为了好还是为了价值)。
正如其他人所提到的,对象需要一个 __toString
方法才能转换为字符串。未定义该方法的对象仍可以使用 spl_object_hash 函数生成字符串表示形式。
此函数返回对象的唯一标识符。这个 id 可以用作存储对象的哈希键,或者用于标识对象,只要对象没有被破坏。一旦对象被销毁,它的哈希值就可以被其他对象重用。
我有一个带有 __toString
方法的基 Object 类,该方法默认调用 md5(spl_object_hash($this))
以使输出明显唯一,因为 spl_object_hash 的输出在对象之间看起来非常相似。
这对于调试一个变量初始化为对象的代码特别有帮助,后来在代码中怀疑它已更改为不同的对象。简单地将变量回显到日志可以揭示对象散列的变化(或不)。
我认为这个问题有点误导,因为 Java 中的 toString() 不仅仅是一种将某些东西转换为字符串的方法。这就是 casting via (string) 或 String.valueOf() 所做的,它在 PHP 中也能正常工作。
// Java
String myText = (string) myVar;
// PHP
$myText = (string) $myVar;
请注意,这可能会产生问题,因为 Java 是类型安全的 (see here for more details)。
但正如我所说,这是强制转换,因此不等同于 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"
“给出字符串表示”是什么意思?想象一个拥有数百万本书的图书馆的课程。
将该类转换为字符串(默认情况下)会将数据(此处为所有书籍)转换为字符串,因此字符串会很长,而且大多数时候也不是很有用。
To 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
所有这些方法都将返回一个字符串,其中一些在内部使用 __toString,而另一些则在对象上失败。查看 PHP documentation 了解更多详细信息。
当预期的字符串变量具有前导零(例如,077543)时,先前答案中的某些(如果不是全部)方法会失败。
尝试转换此类变量无法获得预期的字符串,因为该变量已转换为基数 8(八进制)。
所有这些都会使 $str
的值为 32611:
$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
。注意: (1) 十六进制 ($no=0xff;
) 也一样。 (2) 你可以用 '0'.decoct($no);
取回八进制值 (3) $no="077543";
保持领先的 0
,“077543”+1` 给出 77544
而 077543+1
(正确)给出 32612
。 (PS:没有被否决,因为这个错误很常见)
该文档说您还可以执行以下操作:
$str = "$foo";
和演员表一样,但我觉得它看起来更漂亮。
资源:
俄语
英语
双引号也应该起作用......它应该创建一个字符串,然后它应该在两个空字符串之间追加/插入 $myVar 的转换字符串值。
您始终可以创建一个名为 .ToString($in) 的方法,该方法返回
$in . '';
如果您要转换的不是简单类型(如整数或布尔值),则需要为要转换的类型编写自己的函数/方法,否则 PHP 只会打印类型(例如数组、GoogleSniffer ,或坐浴盆)。
$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()
完全是浪费时间。
对于对象,您可能无法使用强制转换运算符。相反,我使用 json_encode()
方法。
例如,以下内容会将内容输出到错误日志:
error_log(json_encode($args));
试试这个有点奇怪但有效的方法来将 stdClass 的文本部分转换为字符串类型:
$my_std_obj_result = $SomeResponse->return->data; // Specific to object/implementation
$my_string_result = implode ((array)$my_std_obj_result); // Do conversion
__toString 方法或(字符串)强制转换
$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 中的每种数据类型都可以被视为一个对象,并且它们的内部处理程序试图使它们具有某种通用性,即使这意味着失去准确性,例如在将浮点数转换为整数时。除非您在本机扩展中使用它们的 zval,否则您无法像在 Java 中那样处理类型。
虽然 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
不定期副业成功案例分享
Object of class Foo could not be converted to string
。是否有可以将任何东西(数组+对象+任何东西)转换为字符串的通用解决方案?__toString()
称为“魔术方法”的答案,但根本没有提到这一点。用户要求的答案类似于 JavatoString()
方法,而在 PHP 中,这就是__toString()
函数。