[英]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.