Это интересная особенность, которую я обнаружил при цепочке методов, и мне трудно ее обойти. Я уверен, что есть решение или другой способ. Это сложно объяснить, но я сделаю все, что в моих силах.
Пример:
У вас есть три функции, которые являются частью класса, а также 2 защищенных свойства, как показано ниже.
class Chain {
protected $_str = '';
protected $_part = 0;
public function __toString() {
return implode(' ', $this->_str);
}
public function AAA () {
$this->_str[$this->_part] = 'AAA';
$this->_part++;
return $this;
}
public function BBB () {
$this->_str[$this->_part] = 'BBB';
$this->_part++;
return $this;
}
public function wrap ($str) {
$part = $this->_part - 1;
$this->_str[$part] = "({$str})";
return $this;
}
}
Теперь при объединении этих методов в цепочку и особенно при использовании метода переноса непреднамеренно добавляются строки из предыдущих цепочек. Пример:
$chain = new Chain();
$chain->AAA()->BBB()->wrap($chain->AAA());
echo $chain;
Вы ожидаете, что строка будет выглядеть как AAA BBB (AAA)
.
Однако на самом деле возвращается AAA BBB (AAA BBB AAA)
.
Почему wrap()
принимает все предыдущие методы, вызываемые в цепочке, а не только метод, который фактически обернут ею? Каков наилучший способ обойти это, если он есть?
$this->_query[$part] = "({$str})";
наверное должно быть$this->_str[$part] = "({$str})";
- person Nir Alfasi   schedule 15.07.2012