Для того, чтобы делать то, что вы пытаетесь сделать здесь, вам нужно вместо этого использовать следующее:
$x = $test->b($test->a());
Вторая стрелка в выражении
$x = $test->a()->b();
попыток для вызова метода объекта для возвращаемого значения $test->a()
, которое, как вы знаете, является массивом. Он не передает возвращаемое значение a()
в качестве аргумента в b()
.
Чтобы использовать синтаксис типа ->a()->b()
, a()
должен возвращать объект с методом b()
. Если метод b()
является методом из того же объекта, вы можете сделать это, вернув $this
в a()
, но если он также должен вернуть массив, это не сработает, поэтому вы не будете может объединить такие методы в цепочку.
Это возможно заставить его работать, если a()
не возвращает массив, а вместо этого сохраняет в свойстве объекта, а b()
не принимает массив, а вместо этого работает по данным в свойстве.
class Test
{
protected $data;
public function a() {
//getting data...
$this->data = $theDataYouGot;
return $this;
}
public function b($array) {
// do something with $this->data
return true;
}
}
Лично я стараюсь избегать подобных вещей, потому что я думаю, что они добавляют ненужную сложность и затрудняют тестирование без особых дополнительных преимуществ, но я видел, как это было сделано.