我遇到一个PHP错误,我尝试从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
答案 0 :(得分:0)
每个定义,php soap客户端根据其使用的xml定义/ wsdl类型返回stdClass对象。收到的stdClass对象通常包含定义中描述的所有属性。如您所见,minoccurs="0"
属性的定义中有一个additional_attributes
属性。这意味着它可以发生,但不必这样做。因此,结果取决于xml响应中收到的值。
要避免这种行为,只需使用php类,如以下示例所示。 php soap客户端接受一个classmap参数,该参数告诉客户端与定义的类一起使用哪种复杂类型。
实体
class CatalogProductReturnEntity
{
...
public $additional_attributes;
...
}
只需写下一个具有所有在xml定义中定义的属性的实体类。此类可用作肥皂客户端的实体。使用此实体类可以避免PHP注意到属性未定义。
具有类映射的Soap Client
下一步是告诉肥皂客户端,哪些类型用于复杂类型。
$client = new \SoapClien($wsdl, [
'classmap' => [
'catalogProductReturnEntity' => CatalogProductReturnEntity::class,
],
]);
$product = $client->catalogProductInfo($sessionId, 38882);
现在,当接收名称为catalogProductReturnEntity
的复杂类型时,客户端知道要使用哪个类。由于我们的实体类具有名为additional_attributes
的属性,因此您可以轻松地使用$product->additiona_attributes
进行调用。如果没有收到additional_attributes
属性的值,则该值为null
。