【问题标题】:How do I check to see if an object implements ->__toString() in PHP?如何检查对象是否在 PHP 中实现 ->__toString()?
【发布时间】:2011-05-07 00:09:05
【问题描述】:

有没有办法查看一个对象是否专门实现了->__toString?这似乎不起作用:

method_exists($object, '__toString');

【问题讨论】:

  • method_exists 为您的对象返回什么?
  • 这很奇怪,method_exists 应该足以做到这一点。例如,您使用 method_exists 来检查 __toString 是否存在并打印实例,或者如果您得到 false,则使用 get_class 来打印名称。
  • 啊,我刚刚写了一些测试代码,我认为你是对的。请参阅下面的答案

标签: php string object


【解决方案1】:

有两种检查方式。

假设您有课程:

class Foo
{
    public function __toString()
    {
        return 'foobar';
    }
}

class Bar
{
}

那么你可以这样做:

$rc = new ReflectionClass('Foo');       
var_dump($rc->hasMethod('__toString'));

$rc = new ReflectionClass('Bar');       
var_dump($rc->hasMethod('__toString'));

或使用:

$fo = new Foo;
var_dump( method_exists($fo , '__toString'));
$ba = new Bar;
var_dump( method_exists($ba , '__toString'));

不同之处在于,在第一种情况下,该类没有实际实例化。
您可以在这里查看演示:http://codepad.viper-7.com/B0EjOK

【讨论】:

  • 不需要反射或实例化。您可以将类的名称作为第一个参数传递给method_exists(),而不是该类的对象。
【解决方案2】:

反射很慢,我认为这是使用它们的最糟糕的解决方案。

bool method_exists ( mixed $object , string $method_name )

object - 对象实例或类名 (http://php.net/manual/en/function.method-exists.php)

不需要创建对象来检查方法是否存在。

method_exists('foo', '__toString')

interface StringInterface{
   public function __toString() :string;
}


class Foo implement StringInterface {...}

->>(new MyClass) instanceof StringInterface

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      我一定是在其他地方做错了,因为这行得通:

      class Test {
      
      function __toString() {
          return 'Test';
      }
      
      }
      
      $test = new Test();
      
      echo method_exists($test, '__toString');
      

      【讨论】:

        【解决方案5】:

        在 PHP 8 中出现了一个新的 Stringable 接口。
        Stringable 接口可用于键入任何字符串或实现__toString() 的提示。而且,每当一个类实现了__toString(),它都会在后台自动实现接口,无需手动实现

        class Foo
        {
            public function __toString(): string
            {
                return 'foo';
            }
        }
        
        function bar(Stringable $stringable) { /* … */ }
        
        bar(new Foo());
        bar('abc');
        

        参考:source

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-13
          • 1970-01-01
          • 2012-04-27
          • 1970-01-01
          • 2019-09-11
          • 1970-01-01
          • 2016-12-02
          相关资源
          最近更新 更多