Здравствуйте уважаемые гуру PHP!!! Так вышло, что на работе приходится переходить с вражеского C# на свободно-распространяемый PHP (халява сэр). Сильно не бейте, со скриптовыми языками до этого не имел дел от слова совсем. Вопрос такой: есть класс, который ходит по LDAP в ActiveDirectory и берет данные по конкретному юзеру, создаю экземпляр класса, создаю массив, куда буду пихать данные по пользователям, но каждый раз в массиве идет перезапись всех ранее добавленных данных на последние полученные, объясните как тут работать с переменными, я не понимаю. PHP: <?php require_once('User.php'); class Ldap { private $_host; private $_port; private $_user; private $_password; private $_root_search; private $_search_attributes; private $_search_all_groups_attributes; private $_dn = ""; private $_is_connect; private $_connection; private $_search_result; private $_is_search_flag; public $_error_message; private $_ldap_user; public function __construct() { $ini_data = parse_ini_file("..\..\config\LDAPConfig.ini", true); $this->_host = $ini_data["connection"]["host"]; $this->_port = $ini_data["connection"]["port"]; $this->_user = $ini_data["connection"]["user"]; $this->_password = $ini_data["connection"]["password"]; $this->_root_search = $ini_data["search"]["root_search"]; $this->_search_attributes = explode(",", $ini_data["search"]["search_attributes"]); $this->_search_all_groups_attributes = explode(",", $ini_data["search_all_group"]["search_attributes"]); $this->_ldap_user = new User(); } /** * Функция, которая возвращает флаг подключения к LDAP * @param <p>no param</p> * @return <p>boolean true or </p> */ public function connect() { $this->_connection = ldap_connect($this->_host, $this->_port); ldap_set_option($this->_connection, LDAP_OPT_REFERRALS, 0); ldap_set_option($this->_connection, LDAP_OPT_PROTOCOL_VERSION, 3); $ldap_bnd = ldap_bind($this->_connection, $this->_user, $this->_password); if ($ldap_bnd) { $this->_is_connect = true; } else { $this->_is_connect = false; } return $this->_is_connect; } /** * Функция закрытия подключения к LDAP * @param <p>без параметров</p> * @return boolean _is_connect */ public function close(){ if($this->_is_connect){ ldap_close($this->_connection); $this->_is_connect = false; } } /** * * Функция поиска пользователя * @param string $login_user логин пользователя * @param bool $is_nested флаг, который определяет искать вложенные группы или нет * @return array возвращает ассоциированный массив, если code->0, то поиск успешный, если code->-1, то произошла ошибка * result->User(), если поиск успешный, то возвращается заполненный экземпляр класса User() */ public function search_user(string $login_user, bool $is_nested = false) { $result_array = array(); if ($this->_is_connect) { $this->_search_result = ldap_search($this->_connection, $this->_root_search, "(&(objectClass=user)(objectCategory=person)(sAMAccountName=" . $login_user . "))", $this->_search_attributes); $this->_is_search_flag = true; $this->parse_result($this->_search_result); if ($this->_ldap_user->message) { if (!$is_nested) { $result_array = array("code" => 0, "result" => $this->_ldap_user); } else { $this->_search_result = null; $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); $this->parse_nested_group($this->_search_result); $result_array = array("code" => 0, "result" => $this->_ldap_user); } //$this->_user = new User(); } else { $this->_is_search_flag = false; $result_array = array("code" => -1, "result" => "Пользователь не найден"); } } else { $this->_is_search_flag = false; $result_array = array("code" => -1, "result" => ldap_error($this->_connection)); } $this->_is_search_flag = false; return $result_array; } /** * Функция обработки результата поиска * @param type $seach_result результаты поиска * если количество найденых записей больше 0, тогда * получаем все поля класса User. Из конфига берем поля * которые были найдены в AD. * @return boolean проставляется в поле текущего класса $this->_ldap_user->message * true */ private function parse_result(&$seach_result) { if ($this->_is_connect & $this->_is_search_flag) { $info = ldap_get_entries($this->_connection, $seach_result); if ($info["count"] > 0) { $reflection = new ReflectionClass($this->_ldap_user); $user_properties = $reflection->getProperties(); foreach ($this->_search_attributes as $key) { if (strtolower($key) == strtolower("objectSid")) { $this->_ldap_user->{"objectSid"} = $this->SIDtoString($info[0][strtolower("objectSid")][0]); } else if (strtolower($key) == strtolower("memberOf")) { $this->_ldap_user->{$key} = $info[0][strtolower($key)]; } else { $this->_ldap_user->{$key} = $info[0][strtolower($key)][0]; } } $this->_ldap_user->message = true; $this->_dn = $info[0]["dn"]; } } } private function parse_nested_group(&$seach_result) { if ($this->_is_connect & $this->_is_search_flag) { $info = ldap_get_entries($this->_connection, $seach_result); if ($info["count"] > 0) { $memberOf_nested = array(); array_shift($info); foreach($info as $item){ array_push($memberOf_nested,$item["name"][0]); } $this->_ldap_user->memberOf_nested = $memberOf_nested; }else{ echo "group not found \n"; } } } /** * Функция преобразует sid в строку * @param binary $ADsid * @return string */ private function SIDtoString($ADsid) { $sid = "S-"; //$ADguid = $info[0]['objectguid'][0]; $sidinhex = str_split(bin2hex($ADsid), 2); // Byte 0 = Revision Level $sid = $sid . hexdec($sidinhex[0]) . "-"; // Byte 1-7 = 48 Bit Authority $sid = $sid . hexdec($sidinhex[6] . $sidinhex[5] . $sidinhex[4] . $sidinhex[3] . $sidinhex[2] . $sidinhex[1]); // Byte 8 count of sub authorities - Get number of sub-authorities $subauths = hexdec($sidinhex[7]); //Loop through Sub Authorities for ($i = 0; $i < $subauths; $i++) { $start = 8 + (4 * $i); // X amount of 32Bit (4 Byte) Sub Authorities $sid = $sid . "-" . hexdec($sidinhex[$start + 3] . $sidinhex[$start + 2] . $sidinhex[$start + 1] . $sidinhex[$start]); } return $sid; } } вызов: PHP: $ldap = new Ldap(); $data_array = array(); $ldap->connect(); $data = $ldap->search_user("user1",false); array_push($data_array,$data); $data1 = $ldap->search_user("user2",false); array_push($data_array,$data1); $ldap->close(); var_dump($data_array); вывод будет два раза user2
Спасибо, помогло, а что надо почитать, чтобы осознать сей дзен? --- Добавлено --- Представьте себе, C# тоже пришлось на лету учить.
Как полагаешь, где может быть написано (если раньше не знал) про передачу/возвращение объектов по значению/ссылке? Впрочем, есть "Руководство" И много-много умных книг.