В yii очень круто написан функционал работы с веб сервисами. Тип данных для SOAP определяется из списка параметров к функции. За основу был взят данный код из веб сервисов, вот его реализация:
Код: Выделить всё
protected $mapDefaultType = array(
'string','array','bool','float','double','int','integer','long'
);
public function __call($name,$parameters)
{
//защита от бесконечной рекурсии
if($name !== 'behaviors')
{
$reflections = new SplObjectStorage();
$reflections->attach(new ReflectionClass($this));
$list = array_keys($this->behaviors());
for($i = 0; $i < count($list); $i++)
{
$reflections->attach(new ReflectionClass($this->asa($list[$i])));
}
foreach($reflections as $reflection)
{
foreach($reflection->getMethods() as $method)
{
if($method->isPublic() && ($method->getName() === $name))
{
$comment = $method->getDocComment();
if(strpos($comment,'@protected')!==false)
{
$comment=preg_replace('/^\s*\**(\s*?$|\s*)/m','',$comment);
$params=$method->getParameters();
$n=preg_match_all('/^@param\s+([\w\.]+(\[\s*\])?)\s*?.*$/im',$comment,$matches);
if($n>count($params))
{
$n=count($params);
}
for($i=0;$i<$n;++$i)
{
if(in_array($matches[1][$i], $this->mapDefaultType))
{
if(!call_user_func_array('is_'.$matches[1][$i], array($parameters[$i])))
throw new CException(Yii::t('jarick',"Параметр {$parameters[$i]} не являеться типом: {$matches[1][$i]}"));
}else
{
if(!$parameters[$i] instanceof $matches[1][$i])
throw new CException(Yii::t('jarick',"Параметр {$parameters[$i]} не являеться объектом класса: {$matches[1][$i]}"));
}
}
}
}
}
}
}
return parent::__call($name,$parameters);
}
Код: Выделить всё
/**
*Добавление языка
*@param string
*@return bool
*@protected
**/
public function addLang($lang)
Вероятно кто-то уже до меня реализововал нечто подобное, если кто поделиться ссылкой буду рад.