Я использую автообнаружение мыла Zend для создания WSDL-файла для моего веб-сервера.  Проблема в том, что каждый элемент каждого complexType по умолчанию имеет nillable="true" .  Как я объявляю элементы по мере необходимости?  Я читал PHPDoc, но ничего не нашел. 
EDIT: Код:
 class MyService { /** * Identify remote user. * * @param LoginReq * @return LoginResp */ public function login($request) { // Code .... } } class LoginReq { /** @var string */ public $username; /** @var string */ public $password; } class LoginResp { /** @var string */ public $errorCode; } 
Сгенерированный WSDL:
  <xsd:complexType name="LoginReq"> <xsd:all> <xsd:element name="username" type="xsd:string" nillable="true"/> <xsd:element name="password" type="xsd:string" nillable="true"/> </xsd:all> </xsd:complexType> <xsd:complexType name="LoginResp"> <xsd:all> <xsd:element name="errorCode" type="xsd:string" nillable="true"/> </xsd:all> </xsd:complexType> 
  EDIT2: Я просто обнаружил, что для объявления элемента по мере необходимости / необязательно вам нужно использовать minOccurs/maxOcurrs .  Оба по умолчанию равны 1, поэтому по умолчанию каждый элемент требуется.  Чтобы объявить необязательный элемент, вы объявляете его с помощью minOccurs="1" .  Nillable предназначен только для того, чтобы позволить элементам быть пустым.  Опять же, как я объявляю элемент как необязательный (поэтому Zend добавляет minOccurs = "0" к этому элементу)? 
если у вас есть значение по умолчанию, заданное в определении вашей функции, оно будет nillable.
 public function myMethod($argument = 'hello') { // $argument is nillable } 
Если это не так, можете ли вы разместить свой код с блоками doc?
РЕДАКТИРОВАТЬ: Ваш пример кода проясняет многое.
Если вы посмотрите на Zend / Soap / Wsdl / Strategy / DefaultComplesType.php вокруг строки 76, вы увидите следующее:
  // If the default value is null, then this property is nillable. if ($defaultProperties[$propertyName] === null) { $element->setAttribute('nillable', 'true'); } 
Это код, который определяет, является ли ваш атрибут «сложного типа» незаменимым. Я бы попробовал обновить свой код, чтобы включить значение по умолчанию для строк. Что-то вроде:
 class LoginReq { /** @var string */ public $username = ''; /** @var string */ public $password = ''; } 
  Если вы это сделаете, значение === null должно быть равно false.  Однако убедитесь, что ваш код правильно обрабатывает данные. 
Если это не сработает, дайте мне знать!