为什么我无法将此对象(表示Web服务响应)转换为字符串?一些关于PHP对象的疑问
我绝对是新的PHP(我来自强制类型化的Java),我疯了,试图理解为什么我不能转换成字符串这个对象和PHP中的一些对象概念。为什么我无法将此对象(表示Web服务响应)转换为字符串?一些关于PHP对象的疑问
所以我有这样的代码doLogin()方法(成Laravel控制器类):
public function doLogin(){
$userName = Input::get('username');
$pswd = Input::get('password');
//------------------------------------------
// Guzzle clint used to perform REST call:
//------------------------------------------
$client = new Client(); //GuzzleHttp\Client
//----------------------------------------------------------------------------------------------
// Do the REST call and obain the response:
//----------------------------------------------------------------------------------------------
$response = $client->get('http://localhost:8080/Accomodation/7');
// Decode the response into an object:
$dettaglioHotel = json_decode($response->getBody());
//Console::info('username: ' + $userName);
//Console::info('password ' + $pswd);
\Log::info('username: '.$userName);
\Log::info('password '.$pswd);
//\Log::info('hotel: '.$dettaglioHotel);
\Log::info('response status code: '.(string)$response->getStatusCode());
\Log::info('response: '.(string)$dettaglioHotel);
return view('dashboard-hotel');
}
所以你可以在我使用的previus方法见狂饮库执行REST呼叫。
我的疑惑是:
1)进入PhpStorm(使用的IDE),通过鼠标放在的get()方法给我说,返回的对象有型ResponseInterface即一个接口而不是一个具体的类类型。
那究竟是什么意思?这样做:
$response = $client->get('http://localhost/Accomodation/7');
它返回实现ResponseInterface接口的通用对象? Php自动构建类似于实现此接口的通用对象或什么?
2)传递鼠标放在json_decode()函数,这一行:
$dettaglioHotel = json_decode($response->getBody());
在IDE说消息作为“多个实施”并表明有这些2个实施方式:
第一个实现: json_decode ... /供应商/ guzzlehttp /狂饮/ src目录/ functions.php中json_decode
第二个执行: C:/ Program Files文件(86)/ JetBrains公司/ PhpStorm 2016年3月2日/插件/ PHP/lib中/ php.jar /stubs/standard/json.php
它必须使用第一!一个(涉及古惑)但我不确定是否使用正确的。
3)Finnally我想转换为字符串和打印日志包含响应decodification这个对象,以这种方式:
$dettaglioHotel = json_decode($response->getBody());
然后:
\Log::info('response: '.(string)$dettaglioHotel);
但这样做时尝试转换成串(由(字符串)$ dettaglioHotel)应用程序崩溃,我得到这个错误信息:
in LoginBetriviusController.php line 56
at HandleExceptions->handleError('4096', 'Object of class stdClass could not be converted to string', 'C:\Users\Andrea\Documents\Betrivius\WorkSpace\betriviusExtranet\app\Http\Controllers\LoginBetriviusController.php', '56', array('userName' => 'aaa', 'pswd' => 'ddd', 'client' => object(Client), 'response' => object(Response), 'dettaglioHotel' => object(stdClass))) in LoginBetriviusController.php line 56
at LoginBetriviusController->doLogin()
at call_user_func_array(array(object(LoginBetriviusController), 'doLogin'), array()) in Controller.php line 55
at Controller->callAction('doLogin', array()) in ControllerDispatcher.php line 44
at ControllerDispatcher->dispatch(object(Route), object(LoginBetriviusController), 'doLogin') in Route.php line 190
at Route->runController() in Route.php line 144
at Route->run(object(Request)) in Router.php line 653
at Router->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in SubstituteBindings.php line 41
at SubstituteBindings->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in VerifyCsrfToken.php line 65
at VerifyCsrfToken->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in StartSession.php line 64
at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 104
at Pipeline->then(object(Closure)) in Router.php line 655
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 629
at Router->dispatchToRoute(object(Request)) in Router.php line 607
at Router->dispatch(object(Request)) in Kernel.php line 268
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 46
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 104
at Pipeline->then(object(Closure)) in Kernel.php line 150
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 117
at Kernel->handle(object(Request)) in index.php line 54
at require_once('C:\Users\Andrea\Documents\Betrivius\WorkSpace\betriviusExtranet\public\index.php') in server.php line 21
究竟是什么意思?为什么我不能将其转换为字符串?我怎样才能看到这个对象的内容?
- ...通过鼠标放在
get()
方法给我说,返回的对象具有类型ResponseInterface
这是一个接口,而不是一个具体的类类型
那么,方法将返回某种特定类型的具体对象。正如你所建议的那样,PHP不会对某些临时对象产生任何魔力。它只是意味着get()
返回的对象将遵守(implement
)ResponseInterface
。您可以将返回的对象视为拥有该界面中描述的所有方法和属性。 准确使用哪个类实例是无关紧要的。尽可能使用接口而不是具体类来保持实现的灵活性,以在必要时交换具体类,但仍与定义的接口兼容。
开始=“2”>
- 的IDE说消息作为“多个实施”,并显示有这2个实施方式
这意味着相同的功能在实施两次不同的文件。基于各种因素,将在运行时决定使用哪个版本。如果PHP安装没有安装它,最有可能的是Guzzle带有一个后备实现json_decode
。在运行时Guzzle会根据需要有条件地将json_decode
定义为一个polyfill。这通常不需要关心你;你可以假设将使用核心PHP实现。无论哪种方式,两种实现应该相同,否则你会遇到一些兼容性问题。
(它看起来好像狂饮在自己的命名空间定义GuzzleHttp\json_encode
,所以这是一个有点怪异的是,IDE把它捡起作为等同于非命名空间执行; IDE的可能有问题...)
类stdClass的的
开始=“3”>- 对象无法转换为字符串
那么,你不能将对象转换为字符串。它不确定结果应该是什么。什么确实对象的字符串表示看起来像......?也许你想json_encode
吧,这是a对象的字符串表示。或者var_export
也许。或var_dump
,或者定义如何将对象转换为字符串的行为的任何其他特定函数。
简单的解决办法是改变这一行:
// Decode the response into an object:
$dettaglioHotel = json_decode($response->getBody());
到
// Decode the response into an object:
$dettaglioHotel = json_decode($response->getBody()->getContents());
原因是,getBody()
返回EntityBody
对象,当你json_decode
该对象......好,我不确定会发生什么。但我怀疑这是你所期望的。
请注意,使用json_decode
而不将第二个参数设置为true
也会给你一个对象。通常如果我要记录这些,我将只使用Log::info(json_encode($theObject));
。
编辑:它看起来像Guzzle实际上实现了json_decode
版本,所以你的代码将在这种情况下实际工作。与json_encode()
记录将解决您的问题。
嗯,'$ response'好像有一个内建的' - > json()'方法... – deceze
@deceze它看起来像取决于Guzzle的版本,[' - > json()'可能不会实现](http://stackoverflow.com/questions/30530172/guzzle-6-no-more-json-method-for-responses) – Samsquanch
好的。那么你应该链接到更新的文档。我在*你的*链接中偶然发现了它。 – deceze
我认为最后一点有意义,因为'json_decode'会返回一个'stdObject',它不会实现'__toString' https://3v4l.org/cX18r。我想你可以记录'$ response-> getBody()'这已经是一个字符串了吗? – 321zeno