Статьи

Дразнящее замечание по PHP и веб-сервисам

Дейви Шафик опубликовал дразнящее замечание о создании WSDL из кода PHP, связанное с некоторой работой, которую он делает. На самом деле пока ничего не видно, кроме этого примера;


Почему это интересно? Ответ требует небольшого объяснения …

Если вы читали демистифицированные веб-сервисы, вы будете знать, что WSDL (язык описания веб-сервисов) — это разметка XML, которая позволяет описывать веб-сервисы способом, который может использовать компьютер. При построении клиента для веб-службы он отнимает много ручного труда, как вы можете видеть, сравнивая примеры client1.php и client2.php в статье Zend о новом расширении PHP SOAP .

Таким образом, для создания клиентов веб-служб при использовании WSDL это очень просто с PHP (и другими динамически типизированными языками). Однако этого нельзя сказать, когда речь идет о создании серверов с PHP, когда речь идет о создании WSDL.

В WSDL при описании аргументов, которые принимает метод SOAP, и возвращаемого значения, ожидается, что вы используете XML-схему. Схема XML является «строго типизированной» — она ​​имеет полный диапазон примитивных типов (например, string, int и т. Д.), Как вы можете видеть здесь, из которых вы можете создавать сложные типы для представления таких вещей, как объекты и хеши (ассоциативные массивы). Единственная вещь, которую XML-схема не «делает» — это индексированные массивы, которые вместо этого определены в WSDL.

На этом этапе я мог бы разглагольствовать о том, что SOAP / WSDL является фиаско, но я не буду ожидать одного комментария: если вы когда-нибудь будете в ситуации с оценкой использования SOAP, начните с изучения того, что означает SOAP (где-то между «Простой протокол доступа к объектам» и «Сервис-ориентированная архитектура» вы можете начать нервничать).

В любом случае — проблема для динамически типизированных языков (тех, где типы явно объявлены в исходном коде) заключается в том, как автоматизировать процесс генерации WSDL из кода? Как разработчик веб-службы, в идеале вы хотите иметь возможность писать свой код на PHP, а затем иметь какую-то программу, генерирующую WSDL для вас, чтобы сэкономить время, устранить ошибки и т. Д.

Например, в таких языках, как Java или C #, когда вы вынуждены объявлять типы, это не проблема;


public class Calculator {
public int add(int i1, int i2) {
return i1 + i2;
}
public int subtract(int i1, int i2) {
return i1 - i2;
}
}

Методы добавления и вычитания объявляют, какие типы параметров они принимают, а также их возвращаемые значения, так что это просто вопрос использования инструмента, который анализирует исходный код и генерирует WSDL. Но учтите то же самое в PHP;


class Calculator {
function add($i1, $i2) {
return $i1 + $i2;
}
function subtract($i1, $i2) {
return $i1 - $i2;
}
}

Хотя, вероятно, для нас с вами, глядя на этот код, очевидно, что все значения должны быть целыми числами, как программа, анализирующая этот код, справляется с этим?

Чтобы сделать подобное еще интереснее, PHP позволяет вам принимать и возвращать совершенно разные типы в зависимости от обстоятельств времени выполнения. Например, я мог бы изменить метод add выше, чтобы позволить мне добавлять элементы или два массива;


class Calculator {
function add($i1, $i2) {
if ( is_array($i1) && is_array($i2) ) {
$i1count = count($i1);
if ( $i1count == count($i2) ) {
$sums = array();
for ($i=0; $i < $i1count; $i++) {
$sums[$i] = $i1[$i] + $i2[$i];
}
return $sums;
} else {
return FALSE;
}
} else {
return $i1 + $i2;
}
}

// ...

}

Значение, возвращаемое методом add, теперь зависит от значений, которые я ему даю. Попытка автоматически сгенерировать WSDL в этом случае, несомненно, станет проблемой — парсер должен иметь очень глубокое понимание синтаксиса PHP.

Кроме того, есть отголоски той же проблемы, когда речь идет о написании «компиляторов», которые превращают PHP в какую-то другую, более быструю форму (см. Roadsend PCC Джорджа Шлосснагла, микрообзор).

В любом случае, смотрите это место для получения дополнительной информации о создании WSDL из PHP. Было бы здорово, если бы Дэйви справился.