|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2011-08-22 12:16 UTC] donaldinou at gmail dot com
Description: ------------ --- From manual page: http://www.php.net/reflectionmethod.invokeargs%23Description --- There is differences between call_user_func_array and Reflection::invokeArgs method. Some magic methods are correctly called by call_user_func_array, but not in Reflection Object Test script: --------------- if I do this: // Example: $clientSoap->runTransaction($arguments) // call_user_func_array $result = call_user_func_array( array($clientSoap, 'runTransaction'), $arguments ); if (!is_soap_fault($result)) { echo 'The method __doRequest from SoapClient object is called (This is what we want).'; } // with reflection $reflectionMethod = new ReflectionMethod('SoapClient', 'runTransaction'); try { $result = $reflectionMethod->invokeArgs( $clientSoap, $arguments ); if (!is_soap_fault($result)) { echo 'The method __doRequest from SoapClient object is called (This is what we want).'; } } catch (ReflectionException $r) { echo 'The method __doRequest is never called because the methode invokeArgs throw a ReflectionException.'; } Expected result: ---------------- This should be display: The method __doRequest from SoapClient object is called (This is what we want). The method __doRequest from SoapClient object is called (This is what we want). Actual result: -------------- The method __doRequest from SoapClient object is called (This is what we want). The method __doRequest is never called because the methode invokeArgs throw a ReflectionException. PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Oct 28 08:00:01 2025 UTC |
This is old, but I gave the code. How to be more verbose? Anyway, you can copy/paste code below, it is an example more explicit <?php $clientSoap = new SoapClient('http://www.webservicex.net/geoipservice.asmx?WSDL'); $arguments = array('IPAddress' => '8.8.8.8'); // classic call $result = $clientSoap->GetGeoIP($arguments); //var_dump($result); // $result is ok // call_user_func_array $result = call_user_func_array( array($clientSoap, 'GetGeoIP'), array($arguments) ); if (!is_soap_fault($result)) { echo 'OK not a problem.'.PHP_EOL; } // with reflection $reflectionMethod = new ReflectionMethod($clientSoap, 'GetGeoIP'); try { $result = $reflectionMethod->invokeArgs( $clientSoap, array($arguments) ); if (!is_soap_fault($result)) { echo 'Ok not a problem.'.PHP_EOL; } } catch (ReflectionException $r) { print_r($r); // Method SoapClient::GetGeoIP() does not exist } ------------------------------------------- The error raise is: "Uncaught exception 'ReflectionException' with message 'Method SoapClient::GetGeoIP() does not exist' in [...]" This is because $clientSoap is an instanceof SoapClient and the Reflection object does not try to use __getFunctions methods. Why? Because the call is like this: ReflectionMethod->__construct(Object(SoapClient), 'GetGeoIP')