почему массив данных не работает с php magic method __call()?

#php #oop

#php #ооп

Вопрос:

Вот переменная, и ее вывод выглядит следующим образом :

 $a = [2, 3, 4];  
echo implode(',', $a);
  

Вывод

 2,3,4
  

И

У меня есть класс с php magic method __call

 class MagicMethod {

    public function __call ( $pm, $values ) {
        echo "there is not <b>$pm</b> method <br/> and arguments are <br/>";
        echo implode(',', $values);
    }
}

$magic =  new MagicMethod;    
$magic->notExist( [2, 3, 54] );
  

Теперь он показывает мне сообщение об ошибке :

Обратите внимание: преобразование массива в строку в

Почему __call метод получает данные массива?

Комментарии:

1. Потому что вы даете ему массив? ( [2, 3, 54] => это массив). И после этого вы пытаетесь echo использовать массив, что затем приводит к «преобразованию массива в строку …»

2. Потому что вы передаете один аргумент, который оказывается массивом; поэтому внутри __call() он $values[0] … используется echo implode(',', $values[0]); внутри вашего __call() метода

3. implode() функции php нужны array данные ее 2-х аргументов, и я это сделал!!

4. @Xatenev Я повторяю массив с implode помощью функции!

5. echo implode(‘,’, $values);

Ответ №1:

Второй аргумент __call() — это массив всех аргументов, которые были переданы методу.

Из PHP docs:

Аргумент $name — это имя вызываемого метода. Аргумент $arguments — это перечислимый массив, содержащий параметры, переданные методу $name’ed.

В вашем случае $values было бы:

 [
    [2, 3, 54]
]
  

То, что вы делаете, вызывает implode() этот массив, что приводит к ошибке преобразования массива в строку, поскольку [2, 3, 54] не может быть преобразовано в строку.

Ответ №2:

$values в методе __call — это массив аргументов, переданных в методе notExist .

Таким образом, массив, переданный в методе notExist, будет доступен с помощью $values[0] .

Смотрите следующий код.

 class MagicMethod {

    public function __call ( $pm, $values ) {
        echo "there is not <b>$pm</b> method <br/> and arguments are <br/>";
        echo implode(',', $values[0]);
    }
}

$magic =  new MagicMethod;    
$magic->notExist( [2, 3, 54] );