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
và $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
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:
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
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. –
Tôi mệt mỏi một cái gì đó và tôi hy vọng nó sẽ giúp! – oetoni