为什么我无法将此对象(表示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 

究竟是什么意思?为什么我不能将其转换为字符串?我怎样才能看到这个对象的内容?

+0

我认为最后一点有意义,因为'json_decode'会返回一个'stdObject',它不会实现'__toString' https://3v4l.org/cX18r。我想你可以记录'$ response-> getBody()'这已经是一个字符串了吗? – 321zeno

  1. ...通过鼠标放在get()方法给我说,返回的对象具有类型ResponseInterface这是一个接口,而不是一个具体的类类型

那么,方法返回某种特定类型的具体对象。正如你所建议的那样,PHP不会对某些临时对象产生任何魔力。它只是意味着get()返回的对象将遵守(implementResponseInterface。您可以将返回的对象视为拥有该界面中描述的所有方法和属性。 准确使用哪个类实例是无关紧要的。尽可能使用接口而不是具体类来保持实现的灵活性,以在必要时交换具体类,但仍与定义的接口兼容。

  1. 的IDE说消息作为“多个实施”,并显示有这2个实施方式
开始=“2”>

这意味着相同的功能在实施两次不同的文件。基于各种因素,将在运行时决定使用哪个版本。如果PHP安装没有安装它,最有可能的是Guzzle带有一个后备实现json_decode在运行时Guzzle会根据需要有条件地将json_decode定义为一个polyfill。这通常不需要关心你;你可以假设将使用核心PHP实现。无论哪种方式,两种实现应该相同,否则你会遇到一些兼容性问题。

(它看起来好像狂饮在自己的命名空间定义GuzzleHttp\json_encode,所以这是一个有点怪异的是,IDE把它捡起作为等同于非命名空间执行; IDE的可能有问题...)

    类stdClass的的
  1. 对象无法转换为字符串
开始=“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()记录将解决您的问题。

+0

嗯,'$ response'好像有一个内建的' - > json()'方法... – deceze

+0

@deceze它看起来像取决于Guzzle的版本,[' - > json()'可能不会实现](http://stackoverflow.com/questions/30530172/guzzle-6-no-more-json-method-for-responses) – Samsquanch

+0

好的。那么你应该链接到更新的文档。我在*你的*链接中偶然发现了它。 – deceze