Есть XML файл Код (Text): <?xml version="1.0" encoding="utf-8"?> <methodCall> <methodName>test</methodName> <param>123456</param> </methodCall> есть функция: Код (Text): function test($arg) { if ( preg_match("/^[0-9]+$/", $arg) ) { return 'ok'; } else { return 'failed'; } } Я передаю этот файл на страницу, там он принимается: Код (Text): // получаю xml $xml_file = $GLOBALS['HTTP_RAW_POST_DATA']; // открываю для чтения: $xml = new SimpleXMLElement ($xml_file,null,false) ; // вытаскиваю нужные мне значения $fns_array = $xml->xpath('//methodName'); $arg_array = $xml->xpath('//param'); // для удобства переписываю их: $fns = $fns_array[0]; $arg = $arg_array[0]; // и наконец пытаюсь вызвать полученную функцию с аргументами: $result = call_user_func($fns, $arg); в переменных $fns - test, а в $arg - 123456 (я знаю это точно т.к. записывал их в файл) при этом функция test не вызывается в итоге $result пуст. если в call_user_func за место $fns написать 'test' то все работает. В чем может быть косяк?
пишет такое (получено при помощи метода error_get_last): type: 2 message: call_user_func() expects parameter 1 to be a valid callback, no array or string given
ну так отлаживай. var_export($fns). там видимо null окажется — глянешь как добывается эта переменная и в конце концов разберешся как с SimpleXml работать. казалось бы, при чем тут call_user_func…
artoodetoo и снова спасибо, выходит что хоть и записывается оно как test, на самом деле там что то другое, а точнее такое: Код (Text): SimpleXMLElement::__set_state(array( 0 => 'test', )) Я с подобной проблемой столкнулся в первые, по этому и не мог въехать в чем тут может быть проблема, вот и думал на call_user_func, я думал может проблема заключается в том что я удаленно пытаюсь вызвать метод, через протокол. да и еще решение проблемы: Код (Text): $fns = $fns_array[0]->__toString() ; $arg = $arg_array[0]->__toString() ;
Код (PHP): $xml='<?xml version="1.0" encoding="utf-8"?> <methodCall> <methodName>test</methodName> <methodName>test1</methodName> <param>123456</param> <param>Ssgjsdfl;gj;g</param> </methodCall>'; $xml=new SimpleXMLElement($xml); $method=(array)$xml->methodName; $param=(array)$xml->param; function call($method,$param) { $call=array(); if(is_array($method) && is_array($param)) { foreach($method as $key => $value) { if(function_exists($value)) { $call[$value]=call_user_func($value,$param[$key]); } else { $call[$value]='Метод отсутствует!'; } } } return $call; } echo'<pre>'; print_r(call($method,$param)); Код (PHP): Array ( [test] => ok [test1] => Метод отсутствует! ) Если вы хотели метод который будет с много параметров, миксед, эт нужно по другому переписать))) По мне я бы вообще написал бы подобный план: Код (PHP): <method name="test"> <param> 123457 </param> <param> wrefdgjfk </param> ......... </method>
Your, ммм.. я просто тестировал передачу данные не напрямую, а через программу (протокол), по этому то что я понаписал, это так, на скорую руку. мне главное что бы отправлялся запрос и приходил ответ ну и соответственно на серверы выполнялось соответствующие действие.