PHP OOP:流畅的界面和树图
PHP OOP : Fluent interface and tree graphs
我正在尝试为树对象创建一个流畅的界面。
这是我目前所做的一个简化示例:
<?php
class node {
private $childs = array();
private $parent;
public function __construct($parent = null) {
$this->parent = $parent;
}
public function addChild($child) {
$this->childs[] = $child;
return $this;
}
public function createChild() {
return $this->addChild(new node($this));
}
public function setFoo() {
/* do something */
return $this;
}
}
$root = new node();
$root ->addChild((new node($root))
->setFoo()
)->addChild((new node($root))
->setFoo()
);
?>
我想减少创建树的部分。
我想做的是这样的:
$root->createChild()->setFoo();
$root->createChild()->setFoo();
一行。而且无需显式创建新节点实例(就像我在第一个代码中使用 new
运算符所做的那样)。
我的目标是能够创建任意顺序的任意树及其任意阶数的节点,而无需在代码中放置分号。
您可以添加此方法以创建为 child。
public function createManyChild($nbrOfChild) {
for($i = 0; $i < $nbrOfChild; $i++){
$this->addChild(new node($this));
}
return $this;
}
并使用这样的代码。
$root = new node();
$root->createManyChild(3)->setFoo();
我认为您应该更改构造函数和 addChild 函数以始终如一地建立数据中的父/子关系,而不是添加 createChild 函数。完成后,可以使用 addChild 函数和构造函数在没有 createChild 函数的情况下执行您描述的操作。现在,您的构造函数允许在不同的树和树中的分支之间进行交叉链接,因此无论如何都可能需要更改它。
class node {
private $childs = array();
private $parent;
public function __construct(node $parent = null) {
if(!is_null($parent)) {
$parent->addChild($this);
}
}
public function addChild(node $child) {
$this->childs[] = $child;
$child->parent = $this;
return $this;
}
public function setFoo() {
/* do something */
return $this;
}
}
有了这个,您可以将新对象链接到树中:
$tree = (new node())->addChild(new node())
->addChild((new node())->setFoo())
->addChild((new node())->addChild(new node())
->addChild(new node())
->setFoo()
);
尝试使用 createChild 函数是一个陷阱 22 情况,有时您需要父对象,有时您需要子对象。您可以使用包含两者的 return 对象来解决它,但我认为最好避免这种情况。如果您不喜欢“(new node())”语法,静态函数可能是可行的方法:
public static function create(node $parent = null) {
return new node($parent);
}
根据您的口味,哪个可能更漂亮:
$tree = node::create()->addChild(node::create())
->addChild(node::create()->setFoo())
->addChild(node::create()->addChild(new node())
->addChild(new node())
->setFoo()
);
我正在尝试为树对象创建一个流畅的界面。
这是我目前所做的一个简化示例:
<?php
class node {
private $childs = array();
private $parent;
public function __construct($parent = null) {
$this->parent = $parent;
}
public function addChild($child) {
$this->childs[] = $child;
return $this;
}
public function createChild() {
return $this->addChild(new node($this));
}
public function setFoo() {
/* do something */
return $this;
}
}
$root = new node();
$root ->addChild((new node($root))
->setFoo()
)->addChild((new node($root))
->setFoo()
);
?>
我想减少创建树的部分。 我想做的是这样的:
$root->createChild()->setFoo();
$root->createChild()->setFoo();
一行。而且无需显式创建新节点实例(就像我在第一个代码中使用 new
运算符所做的那样)。
我的目标是能够创建任意顺序的任意树及其任意阶数的节点,而无需在代码中放置分号。
您可以添加此方法以创建为 child。
public function createManyChild($nbrOfChild) {
for($i = 0; $i < $nbrOfChild; $i++){
$this->addChild(new node($this));
}
return $this;
}
并使用这样的代码。
$root = new node();
$root->createManyChild(3)->setFoo();
我认为您应该更改构造函数和 addChild 函数以始终如一地建立数据中的父/子关系,而不是添加 createChild 函数。完成后,可以使用 addChild 函数和构造函数在没有 createChild 函数的情况下执行您描述的操作。现在,您的构造函数允许在不同的树和树中的分支之间进行交叉链接,因此无论如何都可能需要更改它。
class node {
private $childs = array();
private $parent;
public function __construct(node $parent = null) {
if(!is_null($parent)) {
$parent->addChild($this);
}
}
public function addChild(node $child) {
$this->childs[] = $child;
$child->parent = $this;
return $this;
}
public function setFoo() {
/* do something */
return $this;
}
}
有了这个,您可以将新对象链接到树中:
$tree = (new node())->addChild(new node())
->addChild((new node())->setFoo())
->addChild((new node())->addChild(new node())
->addChild(new node())
->setFoo()
);
尝试使用 createChild 函数是一个陷阱 22 情况,有时您需要父对象,有时您需要子对象。您可以使用包含两者的 return 对象来解决它,但我认为最好避免这种情况。如果您不喜欢“(new node())”语法,静态函数可能是可行的方法:
public static function create(node $parent = null) {
return new node($parent);
}
根据您的口味,哪个可能更漂亮:
$tree = node::create()->addChild(node::create())
->addChild(node::create()->setFoo())
->addChild(node::create()->addChild(new node())
->addChild(new node())
->setFoo()
);