Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Warning: call_user_func_array()
Форумы портала PHP.SU » » Вопросы новичков » Warning: call_user_func_array()

Страниц (1): [1]
 

1. sugresden - 26 Августа, 2015 - 17:24:43 - перейти к сообщению
Добрый день, имеем ошибку
Warning: call_user_func_array() expects parameter 2 to be array, string given in /var/www/html/stats/includes/cla ss_table.php on line 164

код
PHP:
скопировать код в буфер обмена
  1. function callback($html, $callback, $params = array()) {
  2.         $ret = false;
  3.         if (function_exists($callback) or is_array($callback)) {
  4.                 $ret = call_user_func_array($callback, $params ? array($html, $params) : $html);
  5.         } elseif (strpos($callback, '%') !== false) {
  6.                 $ret = sprintf($callback, $html);
  7.         }
  8.         if ($ret !== false) $html = $ret;
  9.         return $html;
  10. }


прочитал про функцию call_user_func_array()
и не понимаю какую функцию вызывает сей оператор....
2. OrmaJever - 26 Августа, 2015 - 18:02:08 - перейти к сообщению
$html это строка, а второй параметр должен быть массив
3. sugresden - 26 Августа, 2015 - 18:37:30 - перейти к сообщению
неправильно функция описана ?
4. DelphinPRO - 26 Августа, 2015 - 20:04:26 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $ret = call_user_func_array($callback, $params ? array($html, $params) : array($html));
5. sugresden - 27 Августа, 2015 - 16:55:31 - перейти к сообщению
огромное спасибо, но до меня не доходит как это работает
Цитата:
call_user_func_array -- Вызывает пользовательскую функцию с массивом параметров
Описание
mixed call_user_func_array ( callback function [, array param_arr] )

Вызывает пользовательскую функцию function, с параметрами из массива param_arr.


какая функция в моем случае вызывается ?
6. Sail - 27 Августа, 2015 - 17:05:08 - перейти к сообщению
sugresden пишет:
какая функция в моем случае вызывается ?

Та, которая передаётся параметром $callback в Вашу функцию callback().
7. armancho7777777 - 27 Августа, 2015 - 17:25:10 - перейти к сообщению
sugresden, может так будет ясно:
PHP:
скопировать код в буфер обмена
  1. function myFunc($arg1, $arg2, $arg3) {}
  2.  
  3. call_user_func('myFunc', $arg1, $arg2, $arg3);
  4. // Или
  5. call_user_func_array('myFunc', array($arg1, $arg2, $arg3));

(Добавление)
В случае с объектами:
PHP:
скопировать код в буфер обмена
  1. class MyClass {
  2.     public function myMethod($arg1, $arg2, $arg3) {}
  3. }
  4.  
  5.     array(new MyClass(), 'myMethod'),
  6.     $arg1, $arg2, $arg3
  7. );
  8. // Или
  9.     array(new MyClass(), 'myMethod'),
  10.     array($arg1, $arg2, $arg3)
  11. );

Если метод статичный, то первый аргумент массива строка,
или вместо массива строка вида:
"MyClass::staticMethod"
8. sugresden - 27 Августа, 2015 - 17:32:47 - перейти к сообщению
armancho7777777 пишет:
sugresden, может так будет ясно:
PHP:
скопировать код в буфер обмена
  1. function myFunc($arg1, $arg2, $arg3) {}
  2.  
  3. call_user_func('myFunc', $arg1, $arg2, $arg3);
  4. // Или
  5. call_user_func_array('myFunc', array($arg1, $arg2, $arg3));

я понимаю, что написано в вашем примере:
сначала описали функцию myFunc с 3-мя параметрами и потом ее вызвали с 3-мя параметрами

а эту запись я немогу понять
PHP:
скопировать код в буфер обмена
  1. call_user_func_array($callback, $params ? array($html, $params) : array($html));


$callback - это же не функция (или все-таки эта ф-ция)
array($html, $params) : array($html) - почему через двоеточие ? аргументы же через запятую перечисляются. Недоходит что то Огорчение
(Добавление)
появилась новая ошибка
Warning: function_exists() expects parameter 1 to be string, array given in /var/www/html/stats/includes/cla ss_table.php on line 163

PHP:
скопировать код в буфер обмена
  1. function callback($html, $callback, $params = array()) {
  2.         $ret = false;
  3.         if (function_exists($callback) or is_array($callback)) { <<<< 163 строчка
  4.                 $ret = call_user_func_array($callback, $params ? array($html, $params) : array ($html));
  5.         } elseif (strpos($callback, '%') !== false) {
  6.                 $ret = sprintf($callback, $html);
  7.         }
  8.         if ($ret !== false) $html = $ret;
  9.         return $html;
9. DelphinPRO - 27 Августа, 2015 - 17:54:15 - перейти к сообщению
sugresden пишет:
а эту запись я немогу понять

тернарный оператор
эквивалентно этому:
PHP:
скопировать код в буфер обмена
  1. if ($params) {
  2.   $params = array($html, $params);
  3. } else {
  4.   $params = array($html);
  5. }
  6. call_user_func_array($callback, $params);


sugresden пишет:
$callback - это же не функция (или все-таки эта ф-ция)

Откуда я знаю? Улыбка Судя по названию - это функция, или метод класса (то что можно выполнить). К тому первый параметр функции call_user_func_array должен быть выполняемым.
10. armancho7777777 - 27 Августа, 2015 - 19:42:15 - перейти к сообщению
sugresden пишет:
$callback - это же не функция (или все-таки эта ф-ция)

PHP:
скопировать код в буфер обмена
  1. $callback = function(){};
  2. $callback();

(Добавление)
PHP:
скопировать код в буфер обмена
  1. $callback = 'myFuncName';

(Добавление)
sugresden пишет:

PHP:
скопировать код в буфер обмена
  1. if(is_callable($callback)){ /*...*/ }

(Добавление)
И вообще там один говногод.
Куча дырявых проверок.
11. sugresden - 27 Августа, 2015 - 20:25:54 - перейти к сообщению
возможно, но я не вижу альтернативы.... попробую хотя бы до рабочего состояния довести (если терпения хватит)

 

Powered by ExBB FM 1.0 RC1