Неустранимая ошибка: неперехваченная ошибка: вызов функции-члена X на Y - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь выучить OOP PHP, поэтому многое из этого для меня в новинку. Я видел другие сообщения, но не нашел ни одного, отвечающего на мой вопрос.

class Test
{
  public function a(){
    //getting data...
    return $array;
  }
  public function b($array){
    return true;
  }
}


$test = new Test();
$x = $test->a()->b();

Когда я пытаюсь сделать это, я получаю следующую ошибку:

Fatal error: Uncaught Error: Call в функцию-член a () в массиве

Может кто-нибудь объяснить, почему это не работает? a returns an array и b принимает array.

1 Ответ

1 голос
/ 10 июля 2020

Для того, чтобы делать то, что вы пытаетесь сделать здесь, вам нужно вместо этого использовать следующее:

$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;
    }
}

Лично я стараюсь избегать подобных вещей, потому что я думаю, что они добавляют ненужную сложность и затрудняют тестирование без особых дополнительных преимуществ, но я видел, как это было сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...