За последние 24 часа нас посетили 22867 программистов и 1260 роботов. Сейчас ищут 784 программиста ...

Работа с классом

Тема в разделе "PHP для новичков", создана пользователем usa_2019, 13 дек 2018.

  1. usa_2019

    usa_2019 Новичок

    С нами с:
    13 дек 2018
    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте уважаемые гуру PHP!!!

    Так вышло, что на работе приходится переходить с вражеского C# на свободно-распространяемый PHP (халява сэр).
    Сильно не бейте, со скриптовыми языками до этого не имел дел от слова совсем.

    Вопрос такой: есть класс, который ходит по LDAP в ActiveDirectory и берет данные по конкретному юзеру, создаю экземпляр класса, создаю массив, куда буду пихать данные по пользователям, но каждый раз в массиве идет перезапись всех ранее добавленных данных на последние полученные, объясните как тут работать с переменными, я не понимаю.

    PHP:
    1. <?php
    2.  
    3. require_once('User.php');
    4.  
    5. class Ldap {
    6.  
    7.     private $_host;
    8.     private $_port;
    9.     private $_user;
    10.     private $_password;
    11.     private $_root_search;
    12.     private $_search_attributes;
    13.     private $_search_all_groups_attributes;
    14.     private $_dn = "";
    15.     private $_is_connect;
    16.     private $_connection;
    17.     private $_search_result;
    18.     private $_is_search_flag;
    19.     public $_error_message;
    20.     private $_ldap_user;
    21.  
    22.     public function __construct() {
    23.  
    24.         $ini_data = parse_ini_file("..\..\config\LDAPConfig.ini", true);
    25.  
    26.         $this->_host = $ini_data["connection"]["host"];
    27.         $this->_port = $ini_data["connection"]["port"];
    28.         $this->_user = $ini_data["connection"]["user"];
    29.         $this->_password = $ini_data["connection"]["password"];
    30.         $this->_root_search = $ini_data["search"]["root_search"];
    31.         $this->_search_attributes = explode(",", $ini_data["search"]["search_attributes"]);
    32.         $this->_search_all_groups_attributes = explode(",", $ini_data["search_all_group"]["search_attributes"]);
    33.         $this->_ldap_user = new User();
    34.     }
    35.  
    36.     /**
    37.      *  Функция, которая возвращает флаг подключения к LDAP
    38.      *  @param <p>no param</p>
    39.      *  @return <p>boolean true or </p>
    40.      */
    41.     public function connect() {
    42.  
    43.         $this->_connection = ldap_connect($this->_host, $this->_port);
    44.         ldap_set_option($this->_connection, LDAP_OPT_REFERRALS, 0);
    45.         ldap_set_option($this->_connection, LDAP_OPT_PROTOCOL_VERSION, 3);
    46.         $ldap_bnd = ldap_bind($this->_connection, $this->_user, $this->_password);
    47.         if ($ldap_bnd) {
    48.             $this->_is_connect = true;
    49.         } else {
    50.             $this->_is_connect = false;
    51.         }
    52.  
    53.         return $this->_is_connect;
    54.     }
    55.     /**
    56.      * Функция закрытия подключения к LDAP
    57.      * @param <p>без параметров</p>
    58.      * @return boolean _is_connect
    59.      */
    60.     public function close(){
    61.         if($this->_is_connect){
    62.             ldap_close($this->_connection);
    63.             $this->_is_connect = false;
    64.         }
    65.     }
    66.  
    67.     /**
    68.      *
    69.      * Функция поиска пользователя
    70.      * @param string $login_user логин пользователя
    71.      * @param bool $is_nested флаг, который определяет искать вложенные группы или нет
    72.      * @return array возвращает ассоциированный массив, если code->0, то поиск успешный, если code->-1, то произошла ошибка
    73.      *                                                  result->User(), если поиск успешный, то  возвращается заполненный экземпляр класса User()
    74.      */
    75.    
    76.     public function search_user(string $login_user, bool $is_nested = false) {
    77.         $result_array = array();
    78.         if ($this->_is_connect) {
    79.             $this->_search_result = ldap_search($this->_connection, $this->_root_search, "(&(objectClass=user)(objectCategory=person)(sAMAccountName=" . $login_user . "))", $this->_search_attributes);
    80.             $this->_is_search_flag = true;
    81.             $this->parse_result($this->_search_result);
    82.             if ($this->_ldap_user->message) {
    83.                 if (!$is_nested) {
    84.                     $result_array = array("code" => 0, "result" => $this->_ldap_user);
    85.                 } else {
    86.                     $this->_search_result = null;
    87.                     $this->_search_result = ldap_search($this->_connection, $this->_root_search, "(member:1.2.840.113556.1.4.1941:=" . $this->_dn . ")", $this->_search_all_groups_attributes, 0, 0);
    88.                     $this->parse_nested_group($this->_search_result);
    89.                     $result_array = array("code" => 0, "result" => $this->_ldap_user);
    90.                 }
    91.                 //$this->_user = new User();
    92.             } else {
    93.                 $this->_is_search_flag = false;
    94.                 $result_array = array("code" => -1, "result" => "Пользователь не найден");
    95.             }
    96.         } else {
    97.             $this->_is_search_flag = false;
    98.             $result_array = array("code" => -1, "result" => ldap_error($this->_connection));
    99.         }
    100.         $this->_is_search_flag = false;
    101.         return $result_array;
    102.     }
    103. /**
    104. * Функция обработки результата поиска
    105. * @param type $seach_result результаты поиска
    106. * если количество найденых записей больше 0, тогда
    107. * получаем все поля класса User. Из конфига берем поля
    108. * которые были найдены в AD.
    109. * @return boolean проставляется в поле текущего класса $this->_ldap_user->message
    110. * true
    111. */
    112.     private function parse_result(&$seach_result) {
    113.         if ($this->_is_connect & $this->_is_search_flag) {
    114.             $info = ldap_get_entries($this->_connection, $seach_result);
    115.             if ($info["count"] > 0) {
    116.                 $reflection = new ReflectionClass($this->_ldap_user);
    117.                 $user_properties = $reflection->getProperties();
    118.                 foreach ($this->_search_attributes as $key) {
    119.  
    120.                     if (strtolower($key) == strtolower("objectSid")) {
    121.                         $this->_ldap_user->{"objectSid"} = $this->SIDtoString($info[0][strtolower("objectSid")][0]);
    122.                     } else
    123.                     if (strtolower($key) == strtolower("memberOf")) {
    124.                         $this->_ldap_user->{$key} = $info[0][strtolower($key)];
    125.                     } else {
    126.                         $this->_ldap_user->{$key} = $info[0][strtolower($key)][0];
    127.                     }
    128.                 }
    129.                 $this->_ldap_user->message = true;
    130.                 $this->_dn = $info[0]["dn"];
    131.             }
    132.         }
    133.     }
    134.  
    135.     private function parse_nested_group(&$seach_result) {
    136.         if ($this->_is_connect & $this->_is_search_flag) {
    137.             $info = ldap_get_entries($this->_connection, $seach_result);
    138.             if ($info["count"] > 0) {
    139.                 $memberOf_nested = array();
    140.                 array_shift($info);
    141.                 foreach($info as $item){
    142.                    array_push($memberOf_nested,$item["name"][0]);
    143.                 }
    144.                 $this->_ldap_user->memberOf_nested = $memberOf_nested;
    145.             }else{
    146.                 echo "group not found \n";
    147.             }
    148.         }
    149.     }
    150. /**
    151. * Функция преобразует sid в строку
    152. * @param binary $ADsid
    153. * @return string
    154. */
    155.     private function SIDtoString($ADsid) {
    156.         $sid = "S-";
    157.         //$ADguid = $info[0]['objectguid'][0];
    158.         $sidinhex = str_split(bin2hex($ADsid), 2);
    159.         // Byte 0 = Revision Level
    160.         $sid = $sid . hexdec($sidinhex[0]) . "-";
    161.         // Byte 1-7 = 48 Bit Authority
    162.         $sid = $sid . hexdec($sidinhex[6] . $sidinhex[5] . $sidinhex[4] . $sidinhex[3] . $sidinhex[2] . $sidinhex[1]);
    163.         // Byte 8 count of sub authorities - Get number of sub-authorities
    164.         $subauths = hexdec($sidinhex[7]);
    165.         //Loop through Sub Authorities
    166.         for ($i = 0; $i < $subauths; $i++) {
    167.             $start = 8 + (4 * $i);
    168.             // X amount of 32Bit (4 Byte) Sub Authorities
    169.             $sid = $sid . "-" . hexdec($sidinhex[$start + 3] . $sidinhex[$start + 2] . $sidinhex[$start + 1] . $sidinhex[$start]);
    170.         }
    171.         return $sid;
    172.     }
    173. }
    вызов:
    PHP:
    1. $ldap = new Ldap();
    2.     $data_array = array();
    3.     $ldap->connect();
    4.      $data = $ldap->search_user("user1",false);
    5.      array_push($data_array,$data);
    6.     $data1 = $ldap->search_user("user2",false);
    7.     array_push($data_array,$data1);  
    8.     $ldap->close();
    9.     var_dump($data_array);
    вывод будет два раза user2
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Юса, вы Си Шарп тоже по форумам учили? Как на счёт для начала прочесть хотя бы пару книг по РНР?
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @usa_2019, инициализируйте свойство $_ldap_user, например, не в конструкторе, а в методе search_user
     
  4. usa_2019

    usa_2019 Новичок

    С нами с:
    13 дек 2018
    Сообщения:
    3
    Симпатии:
    0
    Спасибо, помогло, а что надо почитать, чтобы осознать сей дзен?
    --- Добавлено ---
    Представьте себе, C# тоже пришлось на лету учить.
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Как полагаешь, где может быть написано (если раньше не знал) про передачу/возвращение объектов по значению/ссылке?
    Впрочем, есть "Руководство" :)
    И много-много умных книг.
     
  6. usa_2019

    usa_2019 Новичок

    С нами с:
    13 дек 2018
    Сообщения:
    3
    Симпатии:
    0
    Ну руководством пользуюсь постоянно, до книг похоже не доберусь, спасибо!!!;)