【问题标题】:PHP equivalent of .NET/Java's toString()PHP 等效于 .NET/Java 的 toString()
【发布时间】:2010-09-06 21:15:08
【问题描述】:

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

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

$myText = $myVar . '';

类似于 Java 或 .NET 中的 ToString() 方法。

【问题讨论】:

  • 这似乎是正确答案:stackoverflow.com/a/3559247/11236 (print_r(foo, true))!
  • 我会使用json_encode($myText)。我发现建议的解决方案 print_r(string)var 适用于标量值和简单对象。对于复杂的变量、类或对象,如果没有定义完整的__toString(),我更喜欢前面提到的json_encode

标签: php string


【解决方案1】:

将它放在双引号中应该可以:

$myText = "$myVar";

【讨论】:

  • 这行得通,但我不知道这是否是在 PHP 中这样做的标准方式。
  • 这是在 bash 中非常标准的做法
  • 如果 $myVar 是具有 __toString 或标量类型的类的对象,则此方法将起作用。在其他情况下会产生错误。
【解决方案2】:

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

$in . '';  

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      您可以使用casting operators:

      $myText = (string)$myVar;
      

      PHP 手册的Strings section 中有更多关于字符串转换和转换的详细信息,包括对布尔值和空值的特殊处理。

      【讨论】:

      • Object of class Foo could not be converted to string。有没有可以将任何东西(数组+对象+任何东西)转换为字符串的通用解决方案?
      • 注意:这将在数组上使用时发出 PHP 通知。
      • @MarkAmery 他给出的答案隐含地将__toString()称为“魔术方法”,但根本没有提及。用户要求的答案类似于 Java toString() 方法,而在 PHP 中,这就是 __toString() 函数。
      • @Supuhstar 嗯,我终于明白你从哪里来了。对不起,如果我之前很迟钝。我同意这是一个相关的细节,添加它会很有价值,也许将答案分为带有标题的“转换原语”和“转换对象”部分。
      【解决方案5】:

      如果您要转换的不是简单类型,如整数或布尔值,您需要为要转换的类型编写自己的函数/方法,否则 PHP 只会打印类型(例如数组、GoogleSniffer 或 Bidet)。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案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);
          

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

              您正在寻找strval:

              string strval ( mixed $var )

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

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

              【讨论】:

              • 这实际上非常有用,因为我想在不使用自定义回调的情况下将所有数字转换为字符串。 $strings = array_map('strval', $my_numbers);
              • 这是唯一适用于 array_map 和一般字符串可调用对象的答案。
              【解决方案10】:

              您可以使用类型转换:

              $var = (string)$varname;
              

              或字符串值:

              $var = strval($varname);
              

              或设置类型:

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

              就类型杂耍而言,它们都为同一件事工作。

              【讨论】:

              • strval($varname) 对我有用,尤其是当值作为“variant”类型返回并且需要转换为字符串或 int 时。
              • strval() 是我一直在寻找的,因为我想将它与array_walk 一起使用。例如。 $array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
              【解决方案11】:

              使用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] 将返回一个字符串。"由于 print_r 是打印对象、数组(以及数字/字符串)的好方法,因此它是将对象转换为人类可读字符串的好方法。
              • 仅供参考的新人,true 部分是必不可少的!我尝试了几种字符串转换方法,包括print_r,但对所有这些方法都感到失望,然后我发现了true 参数(请阅读文档了解它的工作原理)。
              【解决方案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)
              ?>
              

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

              【讨论】:

                【解决方案13】:

                双引号也应该起作用...它应该创建一个字符串,然后它应该在 2 个空字符串之间追加/插入 $myVar 的转换字符串值。

                【讨论】:

                  【解决方案14】:

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

                  如果您点击字符串转换手册的链接,有一个特殊情况非常重要:

                  (string) cast 更可取,特别是如果您的变量 $a 是一个对象,因为 PHP 将通过调用 __toString() 魔法方法(如果在实例化 $a 的类中定义了这种方法)。

                  PHP 做了类似的事情

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

                  (string) 强制转换操作是 PHP5+ 编程的推荐技术,使代码更加面向对象。 IMO 这是与其他 OOP 语言(如 Java/C#/等)的设计相似性(差异)的一个很好的例子,即以它自己特殊的 PHP 方式(无论是为了好还是为了价值)。

                  【讨论】:

                    【解决方案15】:

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

                    例如下面的内容会输出到错误日志中:

                    error_log(json_encode($args));
                    

                    【讨论】:

                      【解决方案16】:

                      文档说你也可以这样做:

                      $str = "$foo";
                      

                      和演员表一样,但我觉得更漂亮。

                      来源:

                      【讨论】:

                        【解决方案17】:

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

                        $my_std_obj_result = $SomeResponse->return->data; // Specific to object/implementation
                        
                        $my_string_result = implode ((array)$my_std_obj_result); // Do conversion
                        

                        【讨论】:

                          【解决方案18】:

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

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

                          感谢: How can I capture the result of var_dump to a string?

                          【讨论】:

                          • 值得一提的是,print_r 不需要它。只需使用覆盖作为字符串返回。
                          • 更好的方法是使用 $result = var_export($someVar, true) 而不使用 ob。
                          【解决方案19】:

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

                          尝试转换此类变量未能获得预期的字符串,因为该变量已转换为 base 8(八进制)

                          所有这些都会使$str 的值为32611

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

                          【讨论】:

                          • 这是nothing fails here的PICNIC(椅子上的问题,而不是电脑上的问题)! 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:没有被否决,因为这个错误很常见)
                          【解决方案20】:

                          您也可以使用var_export PHP 函数。

                          【讨论】:

                            【解决方案21】:

                            我使用variableToString。它处理所有 PHP 类型并且很灵活(如果你愿意,你可以扩展它)。

                            【讨论】:

                              【解决方案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) . "'";
                              

                              【讨论】:

                              • 投了反对票,因为我真的不知道你想告诉我们什么。在字符串上使用strval() 完全是浪费时间。
                              • 伙计,假设您收到了一个字符串值 = 当它重新出现时,它将成为“字符串”。但是,当您想在 javascript 中显示它时,您需要将其设为 'stringx''
                              • 这非常危险(并不是说:完全错误)。请查看stackoverflow.com/q/168214stackoverflow.com/q/23740548 以了解如何安全地将某些内容从 PHP 传递到 JS! (抱歉有点跑题:将 PHP var 传递给 JS 不是问题的一部分。)
                              【解决方案23】:

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

                              此函数返回对象的唯一标识符。这个 id 可以用作存储对象的哈希键,或者用于标识对象,只要对象没有被破坏。一旦对象被销毁,它的哈希值可能会被其他对象重用。

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

                              这对于调试代码特别有用,其中变量初始化为对象,然后在代码中怀疑它已更改为不同的对象。简单地将变量回显到日志可以揭示对象哈希的变化(或不)。

                              【讨论】:

                                【解决方案24】:

                                我认为这个问题有点误导,因为, 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 将为您提供 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了解更多详情。

                                【讨论】:

                                  【解决方案25】:

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

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

                                  您可以将对象视为字符串

                                  
                                  class Foo
                                  {
                                  
                                    public function __toString()
                                    {
                                       return "foo";
                                    }
                                  
                                  }
                                  
                                  echo new Foo(); //foo
                                  

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

                                  
                                  $string=''.$intvariable;
                                  

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 2011-03-23
                                    • 2012-11-28
                                    • 2010-11-20
                                    • 2019-04-15
                                    • 2011-01-27
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多