加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php有ToStringBuilder吗?

发布时间:2020-12-13 17:14:35 所属栏目:PHP教程 来源:网络整理
导读:为了在 PHP中快速编写好的 toString() 方法,我正在寻找像 ToStringBuilder 类的java. 更新: 我不是在问如何使用或实现 toString() .我问的是一个强大的助手,如 ToStringBuilder for java. ToStringBuilder节省了大量时间,因为它可以通过自身反射(例如集合,
为了在 PHP中快速编写好的 toString()方法,我正在寻找像 ToStringBuilder类的java.

更新:
我不是在问如何使用或实现toString().我问的是一个强大的助手,如ToStringBuilder for java. ToStringBuilder节省了大量时间,因为它可以通过自身反射(例如集合,数组,嵌套类)来计算出很多东西.

解决方法

PHP实际上并不需要ToStringBuilder;几乎在所有情况下,一个简单的print_r()或var_dump()将执行转储任何变量(包括对象)以进行调试的工作.要获得更精确和可重现的表示,可以使用var_export().例如:

class Test {
    private $x = 'hello';
    protected $y = 'world';
}

$t = new Test;

var_export($t);
var_dump($t);
print_r($t);

输出:

Test::__set_state(array(
   'x' => 'hello','y' => 'world',))

object(Test)#1 (2) {
  ["x":"Test":private]=>
  string(5) "hello"
  ["y":protected]=>
  string(5) "world"
}

Test Object
(
    [x:Test:private] => hello
    [y:protected] => world
)

var_export()和print_r()都使用第二个参数来返回字符串表示而不是打印它们的输出. var_dump()没有此功能,因此您需要另一种方式:

ob_start();
var_dump($t);
$s = ob_get_clean();

echo "Object is $sn";

参见:print_r() var_dump() var_export()

老答案

根据我对Java实现的理解,这是一个非常简约的PHP端口我掀起了:

class ToStringBuilder
{
    private $o; // the object to build a string for
    private $h; // a hash of parameters

    public function __construct($obj)
    {
        $this->o = $obj;
        $this->h = array();
    }

    public function append($key,$value)
    {
        $this->h[] = "$key=$value";
        // you could also use this for a full representation of the PHP type
        // "$key=" . var_export($value,true)
        return $this; // make it chainable
    }

    // final serialization
    public function toString()
    {
        return get_class($this->o) . '@' . spl_object_hash($this->o) .
            '[' . join(',',$this->h) . ']';
    }

    // help method to avoid a separate $x = new ToStringBuilder() statement
    public function getInstance($obj)
    {
        return new self($obj);
    }
}

这就是你在自己的课堂上使用它的方法:

class Person
{
    private $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function __toString()
    {
        // use ToStringBuilder to form a respresentation
        return ToStringBuilder::getInstance($this)
            ->append('name',$this->name)
            ->toString();
    }
}

$person = new Person("John Doe");
echo $person;
// Person@00000000708ab57c0000000074a48d4e[name=John Doe]

序列化不是很精确,因为布尔值将用空字符串表示或只用1.这可以改进:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读