4

PHP で適切なメソッドをすばやく作成するために、JavatoString()のクラスのようなものを探しています。ToStringBuilder

更新: の使用方法や実装方法について質問しているわけではありませんtoString()ToStringBuilderJavaのような強力なヘルパーについて質問しています。ToStringBuilderリフレクション自体で多くのことを把握できるため (コレクション、配列、ネストされたクラスなど)、時間を大幅に節約できます。

4

2 に答える 2

3

ToStringBuilderPHP には;は必要ありません。ほとんどの場合、シンプルなprint_r()orvar_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()2 番目のパラメーターを使用して、出力を出力する代わりに文字列表現を返します。var_dump()にはこの機能がないため、別の方法が必要です。

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

echo "Object is $s\n";

以下も参照してください。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. これは改善される可能性があります:)

于 2012-12-11T08:09:48.517 に答える
1

これは、リンクしたものと似ていますが、わずかに異なる簡単な実装です。出力はよく似ていますがvar_export(完全に同じではありません)、複数の行にまたがっています。

<?php
class ToStringBuilder{
    private $str;

    public function __construct($my){
        $this->str = get_class($my) . "(\n";
    }

    public static function create($my){
        return new ToStringBuilder($my);
    }

    public function append($name, $var){
        $this->str .= "  " . $name . " => " . str_replace("\n", "\n  ", var_export($var, true)) . ",\n";
        return $this;
    }

    public function __toString(){
        return $this->str . ")";
    }
}

デモ: http://codepad.org/9FJvpODp


使用するには、次のコードを参照してください。

class Person{
    private $name;
    private $age;
    private $hobbies;

    public function __toString(){
        return strval(ToStringBuilder::create($this)
                      ->append("name", $this->name)
                      ->append("age", $this->age)
                      ->append("hobbies", $this->hobbies)
                     );
    }

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

echo new Person("hello", 18, array("swimming", "hiking"));
于 2012-12-11T08:36:18.890 に答える