За последние 24 часа нас посетили 62979 программистов и 1743 робота. Сейчас ищут 896 программистов ...

програмное получение списка полей класса?

Тема в разделе "Прочие вопросы по PHP", создана пользователем krot-s, 8 фев 2007.

  1. krot-s

    krot-s Активный пользователь

    С нами с:
    2 фев 2007
    Сообщения:
    23
    Симпатии:
    0
    Как можно программно получить список полей класса?
    например, есть класс:
    class client
    {
    public $clName;
    public $clAddr;
    public $clTel;
    public $clBaseWebDir;
    public $clBaseMailDir;
    public $clDomainMaxNum;
    }

    Как в цикле получить имена полей, clName, clAddr и т.д. ?
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    krot-s

    можно узнать ЗАЧЕМ???
     
  3. krot-s

    krot-s Активный пользователь

    С нами с:
    2 фев 2007
    Сообщения:
    23
    Симпатии:
    0
    Так удобнее сохранять данные в ldap.

    Спасибо за ответ.
     
  4. krot-s

    krot-s Активный пользователь

    С нами с:
    2 фев 2007
    Сообщения:
    23
    Симпатии:
    0
    не в тем, но может кто знает:
    как в wdsl файле указать несколько сервисов, с разными location, а при создании SOAP клиента указывать, какой сервис использовать?
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а можнопоподробнее. сам много с LDAP работал.
     
  6. krot-s

    krot-s Активный пользователь

    С нами с:
    2 фев 2007
    Сообщения:
    23
    Симпатии:
    0
    пример:
    в ldap создаем схему:

    Код (Text):
    1.  
    2. attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.1 NAME 'clName'
    3.         DESC 'Unique name for client'
    4.         EQUALITY caseExactMatch
    5.         SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
    6.  
    7.  
    8. attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.2 NAME 'clAddr'
    9.         DESC 'Address of client'
    10.         EQUALITY caseIgnoreMatch
    11.         SYNTAX 1.3.6.1.4.1.1466.115.121.1.15)
    12.  
    13.  
    14. attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.3 NAME 'clTel'
    15.         DESC 'Tels of client'
    16.         EQUALITY caseIgnoreMatch
    17.         SYNTAX 1.3.6.1.4.1.1466.115.121.1.15)
    18.  
    19. ## attributes for qoutas
    20. #attribute ( NAME 'clQDomainNumber'
    21. #       DESC 'Maximum number of domains for client'
    22.  
    23.  
    24. ## atributes for admin restrictions values
    25. attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.1.1 NAME 'clBaseWebDir'
    26.         DESC 'Path to root of directories containing client web and ftp data'
    27.         EQUALITY caseExactMatch
    28.         SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
    29.  
    30. attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.1.2 NAME 'clBaseMailDir'
    31.         DESC 'Path to root of directories containing client mail'
    32.         EQUALITY caseExactMatch
    33.         SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
    34.  
    35.  
    36. attributetype ( 1.3.6.1.4.1.6981.11.3.1.9.1.3 NAME 'clDomainMaxNum'
    37.         DESC 'Maximum number of client domains'
    38.         EQUALITY integerMatch
    39.         SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
    40.  
    41.  
    42.  
    43.  
    44. ## New client object type
    45.  
    46. objectclass ( 1.3.6.1.4.1.6981.11.2.30.1 NAME 'dmClient'
    47.         DESC 'Client object. Includes name, tels and address of client'
    48.         MUST ( clName $ clTel $ clAddr $ clBaseWebDir $ clBaseMailDir $ clDomainMaxNum)
    49.         )
    oid-ы неправильные, потом подправлю...

    далее в php делаем класс:
    Код (Text):
    1.  
    2.     class client
    3.     {
    4.         public $clName;
    5.         public $clAddr;
    6.         public $clTel;
    7.         public $clBaseWebDir;
    8.         public $clBaseMailDir;
    9.         public $clDomainMaxNum;
    10.     }
    Как видим, имена полей в схеме и описании класса одинаковые.
    Вот процедура получения объекта из ldap:

    Код (Text):
    1.  
    2.         // получения информации о клиенте
    3.         function get_client_info($client_name)
    4.         {
    5.             // возвращаемый объект
    6.             $client = new client();
    7.  
    8.             $filter = '(&(objectclass=dmClient)(clName='.$client_name.'))';
    9.             $attrs = array();
    10.             $result = ldap_search($this->dbConn, $this->base_dn, $filter, $attrs) or die('unable to find client'); 
    11.             if(!$result)
    12.                 return 0;
    13.  
    14.             $row = ldap_get_entries($this->dbConn, $result);
    15.             //заолняем объект данными
    16.             // получаем список полей класса
    17.             $attrs = get_class_vars( get_class($client) );
    18.             // перебор всех полей
    19.             foreach ($attrs as $key => $value)
    20.             {
    21.                 $client->$key = $row[0][strtolower($key)][0];
    22.             }
    23.                        
    24.             return $client;        
    25.         }
    В принцепе эту функцию подправить, и можно получать любой объект из ldap.
    Если много операций с ldap - весьма удобно.
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    изывестное дело. я все запихивал в массив и не парился.
     
  8. krot-s

    krot-s Активный пользователь

    С нами с:
    2 фев 2007
    Сообщения:
    23
    Симпатии:
    0
    в массив мне не совсем подходит. мне потом эти данные по soap надо передавать, там с объектами красивее выходит :)
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    вам шашечки или ехать?
    я езжу.
     
  10. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    и в чем трудности?
    не знаешь как из масива сделат переменные со значениями?

    $a['b'] = 'c';
    foreach($a as $k => $v) $$k = $v;
    echo $b;
     
  11. krot-s

    krot-s Активный пользователь

    С нами с:
    2 фев 2007
    Сообщения:
    23
    Симпатии:
    0
    в конструкторе SoapServer можно указать маппинг wsdl complex types на php классы. С массивами такое не работает (быстрее всего не работает. сам не проверял.).
    Да и вообще ИМХО с классами работать приятнее. Но это уже дело привычки.