按逻辑顺序执行一致的实现

时间:2015-10-17 16:18:22

标签: php

也许我在标题中表达它是错的,但我只是不明白这样的课程怎么样。

<?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");

也许有人知道怎么做?

2 个答案:

答案 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;方法。

我必须稍微调整你的代码,以便按照你想要的方式完成它的工作。它应该提供一个工作示例来帮助您理解方法链。