PHP で適切なメソッドをすばやく作成するために、JavatoString()
のクラスのようなものを探しています。ToStringBuilder
更新: の使用方法や実装方法について質問しているわけではありませんtoString()
。ToStringBuilder
Javaのような強力なヘルパーについて質問しています。ToStringBuilder
リフレクション自体で多くのことを把握できるため (コレクション、配列、ネストされたクラスなど)、時間を大幅に節約できます。
PHP で適切なメソッドをすばやく作成するために、JavatoString()
のクラスのようなものを探しています。ToStringBuilder
更新: の使用方法や実装方法について質問しているわけではありませんtoString()
。ToStringBuilder
Javaのような強力なヘルパーについて質問しています。ToStringBuilder
リフレクション自体で多くのことを把握できるため (コレクション、配列、ネストされたクラスなど)、時間を大幅に節約できます。
ToStringBuilder
PHP には;は必要ありません。ほとんどの場合、シンプルな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
. これは改善される可能性があります:)
これは、リンクしたものと似ていますが、わずかに異なる簡単な実装です。出力はよく似ていますが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"));