За последние 24 часа нас посетили 16843 программиста и 1641 робот. Сейчас ищет 901 программист ...

Проблема с call_user_func

Тема в разделе "PHP для новичков", создана пользователем VLK, 22 мар 2014.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Есть XML файл
    Код (Text):
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <methodCall>
    3. <methodName>test</methodName>
    4. <param>123456</param>
    5. </methodCall>
    есть функция:
    Код (Text):
    1. function test($arg) {
    2. if ( preg_match("/^[0-9]+$/", $arg) ) { return 'ok'; }
    3. else { return 'failed'; }
    4. }
    Я передаю этот файл на страницу, там он принимается:
    Код (Text):
    1. // получаю xml
    2. $xml_file = $GLOBALS['HTTP_RAW_POST_DATA'];
    3.  
    4. // открываю для чтения:
    5. $xml = new SimpleXMLElement ($xml_file,null,false) ;
    6.  
    7. // вытаскиваю нужные мне значения
    8. $fns_array = $xml->xpath('//methodName');
    9. $arg_array = $xml->xpath('//param');
    10.  
    11. // для удобства переписываю их:
    12. $fns = $fns_array[0];
    13. $arg = $arg_array[0];
    14.  
    15. // и наконец пытаюсь вызвать полученную функцию с аргументами:
    16. $result = call_user_func($fns, $arg);
    в переменных $fns - test, а в $arg - 123456 (я знаю это точно т.к. записывал их в файл)

    при этом функция test не вызывается в итоге $result пуст.
    если в call_user_func за место $fns написать 'test' то все работает.

    В чем может быть косяк?
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    А какие ошибки?
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    пишет такое (получено при помощи метода error_get_last):

    type: 2
    message: call_user_func() expects parameter 1 to be a valid callback, no array or string given
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    ну так отлаживай. var_export($fns). там видимо null окажется — глянешь как добывается эта переменная и в конце концов разберешся как с SimpleXml работать.

    казалось бы, при чем тут call_user_func…
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    artoodetoo и снова спасибо, выходит что хоть и записывается оно как test, на самом деле там что то другое, а точнее такое:
    Код (Text):
    1. SimpleXMLElement::__set_state(array( 0 => 'test', ))
    Я с подобной проблемой столкнулся в первые, по этому и не мог въехать в чем тут может быть проблема, вот и думал на call_user_func, я думал может проблема заключается в том что я удаленно пытаюсь вызвать метод, через протокол.

    да и еще решение проблемы:
    Код (Text):
    1. $fns = $fns_array[0]->__toString() ;
    2. $arg = $arg_array[0]->__toString() ;
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $xml='<?xml version="1.0" encoding="utf-8"?>
    2. <methodCall>
    3. <methodName>test</methodName>
    4. <methodName>test1</methodName>
    5. <param>123456</param>
    6. <param>Ssgjsdfl;gj;g</param>
    7. </methodCall>';
    8. $xml=new SimpleXMLElement($xml);
    9. $method=(array)$xml->methodName;
    10. $param=(array)$xml->param;
    11. function call($method,$param) {
    12.     $call=array();
    13.     if(is_array($method) && is_array($param)) {
    14.         foreach($method as $key => $value) {
    15.             if(function_exists($value)) {
    16.                 $call[$value]=call_user_func($value,$param[$key]);
    17.             } else {
    18.                 $call[$value]='Метод отсутствует!';
    19.             }
    20.         }
    21.     }
    22.     return $call;
    23. }
    24. echo'<pre>';
    25. print_r(call($method,$param));
    Код (PHP):
    1. (
    2.     [test] => ok
    3.     [test1] => Метод отсутствует!
    4. )
    Если вы хотели метод который будет с много параметров, миксед, эт нужно по другому переписать)))
    По мне я бы вообще написал бы подобный план:
    Код (PHP):
    1. <method name="test">
    2.     <param>
    3.         123457
    4.     </param>
    5.     <param>
    6.         wrefdgjfk
    7.     </param>
    8.     .........
    9. </method>
     
  7. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Your, ммм.. я просто тестировал передачу данные не напрямую, а через программу (протокол), по этому то что я понаписал, это так, на скорую руку.

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