Как можно программно получить список полей класса? например, есть класс: class client { public $clName; public $clAddr; public $clTel; public $clBaseWebDir; public $clBaseMailDir; public $clDomainMaxNum; } Как в цикле получить имена полей, clName, clAddr и т.д. ?
не в тем, но может кто знает: как в wdsl файле указать несколько сервисов, с разными location, а при создании SOAP клиента указывать, какой сервис использовать?
пример: в ldap создаем схему: Код (Text): attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.1 NAME 'clName' DESC 'Unique name for client' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.2 NAME 'clAddr' DESC 'Address of client' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15) attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.3 NAME 'clTel' DESC 'Tels of client' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15) ## attributes for qoutas #attribute ( NAME 'clQDomainNumber' # DESC 'Maximum number of domains for client' ## atributes for admin restrictions values attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.1.1 NAME 'clBaseWebDir' DESC 'Path to root of directories containing client web and ftp data' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.1.2 NAME 'clBaseMailDir' DESC 'Path to root of directories containing client mail' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.1.3 NAME 'clDomainMaxNum' DESC 'Maximum number of client domains' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) ## New client object type objectclass ( 1.3.6.1.4.1.6981.11.2.30.1 NAME 'dmClient' DESC 'Client object. Includes name, tels and address of client' MUST ( clName $ clTel $ clAddr $ clBaseWebDir $ clBaseMailDir $ clDomainMaxNum) ) oid-ы неправильные, потом подправлю... далее в php делаем класс: Код (Text): class client { public $clName; public $clAddr; public $clTel; public $clBaseWebDir; public $clBaseMailDir; public $clDomainMaxNum; } Как видим, имена полей в схеме и описании класса одинаковые. Вот процедура получения объекта из ldap: Код (Text): // получения информации о клиенте function get_client_info($client_name) { // возвращаемый объект $client = new client(); $filter = '(&(objectclass=dmClient)(clName='.$client_name.'))'; $attrs = array(); $result = ldap_search($this->dbConn, $this->base_dn, $filter, $attrs) or die('unable to find client'); if(!$result) return 0; $row = ldap_get_entries($this->dbConn, $result); //заолняем объект данными // получаем список полей класса $attrs = get_class_vars( get_class($client) ); // перебор всех полей foreach ($attrs as $key => $value) { $client->$key = $row[0][strtolower($key)][0]; } return $client; } В принцепе эту функцию подправить, и можно получать любой объект из ldap. Если много операций с ldap - весьма удобно.
в массив мне не совсем подходит. мне потом эти данные по soap надо передавать, там с объектами красивее выходит
и в чем трудности? не знаешь как из масива сделат переменные со значениями? $a['b'] = 'c'; foreach($a as $k => $v) $$k = $v; echo $b;
в конструкторе SoapServer можно указать маппинг wsdl complex types на php классы. С массивами такое не работает (быстрее всего не работает. сам не проверял.). Да и вообще ИМХО с классами работать приятнее. Но это уже дело привычки.