繁体   English   中英

SOAP函数返回一个stdClass

[英]SOAP function returns a stdClass

我得到一个PHP错误eveyrtime我尝试从SOAP WSDL访问对象属性。

我想它应该返回一个associativeArray类型,但我试图做一个print_r,stdClass仍然存在。

这是产品对象的WSDL结构:

<complexType name="catalogProductReturnEntity">
<all>
<element name="product_id" type="xsd:string" minOccurs="0"/>
<element name="sku" type="xsd:string" minOccurs="0"/>
<element name="set" type="xsd:string" minOccurs="0"/>
<element name="type" type="xsd:string" minOccurs="0"/>
<element name="categories" type="typens:ArrayOfString" minOccurs="0"/>
<element name="websites" type="typens:ArrayOfString" minOccurs="0"/>
<element name="created_at" type="xsd:string" minOccurs="0"/>
<element name="updated_at" type="xsd:string" minOccurs="0"/>
<element name="type_id" type="xsd:string" minOccurs="0"/>
<element name="name" type="xsd:string" minOccurs="0"/>
<element name="description" type="xsd:string" minOccurs="0"/>
<element name="short_description" type="xsd:string" minOccurs="0"/>
<element name="weight" type="xsd:string" minOccurs="0"/>
<element name="status" type="xsd:string" minOccurs="0"/>
<element name="url_key" type="xsd:string" minOccurs="0"/>
<element name="url_path" type="xsd:string" minOccurs="0"/>
<element name="visibility" type="xsd:string" minOccurs="0"/>
<element name="category_ids" type="typens:ArrayOfString" minOccurs="0"/>
<element name="website_ids" type="typens:ArrayOfString" minOccurs="0"/>
<element name="has_options" type="xsd:string" minOccurs="0"/>
<element name="gift_message_available" type="xsd:string" minOccurs="0"/>
<element name="price" type="xsd:string" minOccurs="0"/>
<element name="special_price" type="xsd:string" minOccurs="0"/>
<element name="special_from_date" type="xsd:string" minOccurs="0"/>
<element name="special_to_date" type="xsd:string" minOccurs="0"/>
<element name="tax_class_id" type="xsd:string" minOccurs="0"/>
<element name="tier_price" type="typens:catalogProductTierPriceEntityArray" minOccurs="0"/>
<element name="meta_title" type="xsd:string" minOccurs="0"/>
<element name="meta_keyword" type="xsd:string" minOccurs="0"/>
<element name="meta_description" type="xsd:string" minOccurs="0"/>
<element name="custom_design" type="xsd:string" minOccurs="0"/>
<element name="custom_layout_update" type="xsd:string" minOccurs="0"/>
<element name="options_container" type="xsd:string" minOccurs="0"/>
<element name="additional_attributes" type="typens:associativeArray" minOccurs="0"/>
</all>
</complexType>

这是我正在尝试的代码:

$product = $proxy->catalogProductInfo($sessionId, 38882);
print_r($product->additional_attributes);

additional_attributes (返回stdClass的那个)之外的所有属性都可以正常工作。

当我尝试访问additional_attributes时,服务器返回以下内容:

Notice: Undefined property: stdClass::$additional_attributes in /Applications/XAMPP/xamppfiles/htdocs/php_test/test.php on line 23

根据定义,php soap客户端根据它使用的xml定义/ wsdl类型返回stdClass对象。 收到的stdClass对象通常包含定义中描述的所有属性。 正如你可以看到有“SA minoccurs="0"的定义属性的additional_attributes属性。 这意味着它可以发生,但不必。 因此,结果取决于xml响应中收到的值。

为了避免这种行为,只需使用php类,如下例所示。 php soap客户端接受一个classmap参数,该参数告诉客户端使用哪个复杂类型与定义的类。

实体

class CatalogProductReturnEntity
{
    ...
    public $additional_attributes;
    ...
}

只需写下具有xml定义中定义的所有属性的实体类。 此类可用作soap客户端的实体。 使用此实体类可以避免PHP通知,即未定义属性。

具有类映射的Soap客户端

下一步是告诉soap客户端,哪些类与复杂类型一起使用。

$client = new \SoapClien($wsdl, [
    'classmap' => [
        'catalogProductReturnEntity' => CatalogProductReturnEntity::class,
    ],
]);

$product = $client->catalogProductInfo($sessionId, 38882);

现在,当收到名为catalogProductReturnEntity的复杂类型时,客户端知道要使用哪个类。 由于我们的实体类有一个名为additional_attributes的属性,因此您可以使用$product->additiona_attributes轻松调用它。 如果没有收到additional_attributes属性的值,则该值将为null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM