2017-03-15 22 views
5

Trong PHP, chúng tôi có các lớp học SoapVarSoapParam. Tôi đã nhầm lẫn đủ lâu, vì không có tài liệu phong nha về chúng trên php.net.Sự khác nhau giữa SoapVar và SoapParam là gì?

Hôm nay tôi rất ngạc nhiên khi phát hiện ra rằng những dòng sẽ tạo ra kết quả chính xác cùng trong đầu vào XML:

đoạn
$soapVar = new SoapVar((object) ['Foo' => 'bar'], null, null, null, 'TagName'); 
$soapParam = new SoapParam((object) ['Foo' => 'bar'], 'TagName'); 

Trong hầu hết các SoapClient hướng dẫn, tôi đã thấy với SoapParam bên SoapVar mỗi khi ai đó muốn thiết lập tùy chỉnh xsi:type:

$response = $soapClient->DoSomething(
    new SoapParam(
     new SoapVar(
      (object) ['Foo' => 'bar'], 
      null, 
      'TypeName' 
     ), 
     'TagName' 
    ) 
); 

Đó là thực sự unintuitive, vì SoapVarSoapParam tên lớp không nói nhiều. Cùng một kết quả có thể đạt được bằng cách thanh lịch hơn:

$response = $soapClient->DoSomething(
    new SoapVar(
     (object) ['Foo' => 'bar'], 
     null, 
     'TypeName', 
     null, 
     'TagName' 
    ) 
); 

Mục đích của SoapParam là gì? Nó chỉ là phiên bản đơn giản hơn của SoapVar? Có vẻ như hai người này bối rối và hiểu lầm rất nhiều. Có bất kỳ hành vi bổ sung nào được đính kèm với SoapParam không?

+0

Bất kỳ tin tức nào về điều này?Đối mặt với sự hiểu lầm cùng vào lúc này, và PHPDoc sucks trên – Aziule

+0

này tôi nghĩ bất kỳ tin tức về vấn đề này là những cái tôi đã viết ở trên. SOAP của PHP là một mớ hỗn độn. –

+0

Tôi mệt mỏi một cái gì đó và tôi hy vọng nó sẽ giúp! – oetoni

Trả lời

1

Bạn đúng hướng dẫn là một chút mơ hồ giải thích sự khác biệt chính xác trong lý thuyết và tôi đã ngạc nhiên rằng cho đến bây giờ không ai chỉ ra một số thông tin chi tiết hoặc giải thích sự khác biệt của họ.

Bằng cách hướng dẫn

SoapParam:

Đại diện cho tham số để một cuộc gọi SOAP.

SoapVal:

Một lớp đại diện cho một biến hoặc đối tượng để sử dụng với các dịch vụ SOAP.

tôi đã đi xuống một chút và sự khác biệt chính tôi có thể tìm được các data tham số trong constructor đại diện của họ:

cho SoapParam::SoapParam (mixed $data , string $name) nơi $data =

Số liệu để vượt qua hoặc trả lại. Tham số này có thể được chuyển trực tiếp dưới dạng giá trị PHP , nhưng trong trường hợp này, nó sẽ được đặt tên là paramN và dịch vụ SOAP có thể không hiểu được.

trong khi mặt khác chúng tôi có SoapVar::SoapVar (mixed $data , string $encoding [, string $type_name [, string $type_namespace [, string $node_name [, string $node_namespace ]]]]) nơi $data =

Số liệu để vượt qua hoặc trả lại.

Bằng cách xem xét hai điều này, ví dụ trong Hướng dẫn sử dụng PHP, tôi tin điểm tốt cho sự khác biệt chính trong đối số và bạn có thể làm gì với một đối tượng không thể thực hiện được.

Trong trường hợp của SoapParam

<?php 
$client = new SoapClient(null,array('location' => "http://localhost/soap.php", 
            'uri'  => "http://test-uri/")); 
$client->SomeFunction(new SoapParam($a, "a"), 
         new SoapParam($b, "b"), 
         new SoapParam($c, "c")); 
?> 

nơi $a, $b$c là các biến PHP gửi trực tiếp mà không cho chúng đi qua một cấu trúc/lớp. Phương thức khởi tạo SaopParam nhận thông số $data (Biến PHP) và đại diện chuỗi của tên tham số.

Về phía SoapVar khác

<?php 
class SOAPStruct { 
    function SOAPStruct($s, $i, $f) 
    { 
     $this->varString = $s; 
     $this->varInt = $i; 
     $this->varFloat = $f; 
    } 
} 
$client = new SoapClient(null, array('location' => "http://localhost/soap.php", 
            'uri'  => "http://test-uri/")); 
$struct = new SOAPStruct('arg', 34, 325.325); 
$soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "SOAPStruct", "http://soapinterop.org/xsd"); 
$client->echoStruct(new SoapParam($soapstruct, "inputStruct")); 
?> 

Như bạn có thể thấy, các đối số/biến được chuyển qua lớp mỗi định nghĩa và sau khi một đối tượng của lớp đó được thông qua như là đối số. Lớp đó là đại diện của Cấu trúc SOAP (SOAP có thể nhận ra/Nghìn rủi ro với SoapParam).

Phần gần như khó hiểu ... mặc dù có một vài khác biệt trong hàm tạo tại sao lại có cùng một hành vi trên ví dụ của bạn?

$soapVar = new SoapVar((object) ['Foo' => 'bar'], null, null, null, 'TagName'); 
$soapParam = new SoapParam((object) ['Foo' => 'bar'], 'TagName'); 

tôi không ngạc nhiên, như đã đề cập ở trên các dữ liệu hoặc một cấu trúc SOAP hoặc một biến PHP của một cấu Xà phòng ĐÚNG là :) cùng nhờ vào hướng đối tượng chúng ta vượt qua những đối tượng sản xuất bởi một lớp PHP. Trong số SoapVar việc xây dựng đối tượng có nhiều tùy chọn hơn, do đó cho phép người dùng thích nghi với yêu cầu "an toàn" hơn đối với cuộc gọi SOAP. Trong khi trên SoapParam đối tượng có thể được xây dựng bằng cách truyền bất kỳ đối tượng nào và tiếp theo tên của đối tượng đó.

(object) ['Foo' => 'bar'] của bạn rất đơn giản và không cần mã hóa lược đồ XML, do đó cuộc gọi SOAP nhận được nó tôi tin có thể rất dễ hiểu. Nó không có nhu cầu sử dụng

  • mã hóa

Các mã hóa ID, một trong những hằng số XSD _....

là tham số thứ hai trong hàm tạo SoapVar. Cuối cùng, vì cả hai đều chấp nhận một đối tượng (bất kỳ đối tượng nào) thay cho sự hiểu biết của tôi, SoapVar chỉ cung cấp khả năng xây dựng một yêu cầu an toàn hơn để được hiểu bởi cuộc gọi SOAP thông qua các đối số bổ sung trong hàm khởi tạo. . SoapParam chỉ là một badass và cho phép bạn gửi bất cứ điều gì bạn thích với rủi ro SOAP từ chối nó .... nó giống như hầu như muốn hoạt động như RESP: P không quan tâm đến kiểu cũng như cấu trúc của dữ liệu mà nó gửi :)

Tài liệu tham khảo:

Các vấn đề liên quan