也许我在标题中表达它是错的,但我只是不明白这样的课程怎么样。
<?php
class sample{
public $data = [];
public function pushIndex($index){
array_push($this->data, $index);
}
public function pushValue($value){
array_push($this->data["index"], $value);
// Some magic
}
public function forIndex($index){
return $this->data[$index];
// Some magic
}
}
为了实现像Symfony这样的方案,这将是意大利面条
<?php
$a = new sample;
$a->pushIndex("index")->pushValue("value");
$a->forIndex("index2")->pushValue("value2");
也许有人知道怎么做?
答案 0 :(得分:3)
您正在谈论的内容称为Fluent interface。 使用$ this返回当前对象。
public function pushIndex($index){
array_push($this->a,$index);
return $this;
}
但你想要的是做这样的事情:
class sample
{
protected $a = [];
protected $currentIndex = null;
public function pushIndex($index)
{
$this->currentIndex = $index;
return $this;
}
public function pushValue($value)
{
if ($this->currentIndex === null) {
throw new LogicException('You need to call "pushIndex" or "forIndex" first.');
}
$this->a[$this->currentIndex] = $value;
return $this;
}
public function forIndex($index)
{
if (!isset($this->a[$index])) {
throw new RuntimeException(sprintf('Index "%s" doesn\'t exists', $index));
}
$this->currentIndex = $index;
return $this;
}
public function getArray()
{
return $this->a;
}
}
$a = new sample;
$a->pushIndex("index")->pushValue("value");
$a->forIndex("index2")->pushValue("value2"); // exception?
var_dump($a->getArray());
但你想要的还不太清楚。
答案 1 :(得分:1)
我认为你想要达到的目标是这样的:
class sample{
public $a = [];
public $index = null;
public function pushIndex($index){
$this->index = $index;
$this->a[$index] = null;
return $this;
}
public function pushValue($value){
$this->a[$this->index] = $value;
return $this;
}
public function forIndex($index){
$this->index = $index;
return $this;
}
}
$a = new sample;
$a->pushIndex("index")->pushValue("value");
$a->forIndex("index2")->pushValue("value2");
echo "<pre>";
var_dump($a);
echo "</pre>";
这称为&#34;方法链接&#34;。通过返回对被调用对象的引用,您可以在对象上执行更多方法,基本上是#34;链接&#34;方法。
我必须稍微调整你的代码,以便按照你想要的方式完成它的工作。它应该提供一个工作示例来帮助您理解方法链。