Программисты должны избегать методов, скрывающих наследование любой ценой.
По моему опыту, практически в каждом месте, где я когда-либо видел унаследованный метод сокрытия, это вызывало проблемы. Скрытие метода приводит к тому, что объекты ведут себя по-разному, когда к ним обращаются через ссылку на базовый тип и ссылку на производный тип - как правило, это плохо. Хотя многие программисты формально не знают об этом, большинство интуитивно ожидают, что объекты будут придерживаться принципа замены Лискова . Когда объекты нарушают это ожидание, многие из допущений, присущих объектно-ориентированным системам, могут начать разрушаться. Наиболее вопиющие случаи, которые я видел, это когда скрытый метод изменяет состояние экземпляра объекта. В этих случаях поведение объекта может изменяться тонкими способами, которые трудно отладить и диагностировать.
Хорошо, поэтому могут быть редкие случаи, когда скрытие методов действительно полезно и полезно - например, эмуляция ковариации возвращаемого типа методов в языках, которые ее не поддерживают. Но подавляющее большинство времени, когда разработчики используют сокрытие метода, происходит либо по незнанию (или по случайности), либо как способ взломать какую-то проблему, которая, вероятно, заслуживает лучшего подхода к проектированию. В целом, я видел полезные случаи сокрытия методов (не говоря уже о том, что других нет), когда метод без побочных эффектов, возвращающий некоторую информацию, скрыт тем, который вычисляет нечто более применимое к контексту вызова.
Такие языки, как C #, немного улучшили ситуацию, потребовав ключевое слово new
для методов, которые скрывают метод базового класса - по крайней мере, помогая избежать принудительного использования скрытия методов. Но я нахожу, что многие люди все еще путают значение new
со значением override
- особенно потому, что в простых сценариях их поведение может выглядеть идентично. Было бы хорошо, если бы такие инструменты, как FxCop, действительно имели встроенные правила для выявления потенциально неправильного использования сокрытия методов.
Кстати, метод сокрытия с помощью наследования не следует путать с другими видами сокрытия - например, с помощью вложения - который я считаю допустимым и полезным конструктом с меньшим количеством потенциальных проблем.
Я думаю, вам просто нужно установить версию протокола ldap равной 3
echo "<h3>LDAP query test</h3>";
echo "Connecting ...";
$ldap_server = 'ldaps://server';
$ldap_port = '636';
$ds = ldap_connect($ldap_server, $ldap_port);
if ($ds)
{
//add this
if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3))
{
fatal_error("Failed to set LDAP Protocol version to 3, TLS not supported.");
}
echo "<br><br>Binding ...";
$r=ldap_bind($ds); // this is an "anonymous" bind, typically
// read-only access
echo "Bind result is " . $r . "<br />";
echo "Searching for (sn=S*) ...";
// Search surname entry
$sr=ldap_search($ds, "ou=people,o=server.ca,o=server", "uid=username*");
echo "Search result is " . $sr . "<br />";
echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />";
echo "Getting entries ...<p>";
$info = ldap_get_entries($ds, $sr);
echo "Data for " . $info["count"] . " items returned:<p>";
print_r($info);
// for ($i=0; $i<$info["count"]; $i++) {
// echo "dn is: " . $info[$i]["dn"] . "<br />";
// echo "first cn entry is: " . $info[$i]["cn"][0] . "<br />";
// echo "first email entry is: " . $info[$i]["mail"][0] . "<br /><hr />";
// }
echo "Closing connection";
ldap_close($ds);
}
else
{
echo "<h4>Unable to connect to LDAP server</h4>";
}
Проблема не связана с фактическим процессом привязки (неверные учетные данные), поскольку предупреждение будет другим, если сервер LDAP не сможет аутентифицировать ваши учетные данные. Но, как заметил Пол Диксон , использование ldap_set_option ($ ds, LDAP_OPT_PROTOCOL_VERSION, 3)
должно быть обязательным - хотя я не думаю, что это является причиной ваших проблем.
ldaps: // <>: 636
. ext / ldap
имеет некоторые проблемы с защищенными соединениями SSL / TLS. Вы можете попробовать добавить
TLS_REQCERT never
в ldap.conf
( /etc/ldap.conf
или /etc/ldap/ldap.conf
на * nix -системы) или для компьютеров Windows создайте ldap.conf
с указанным выше содержимым в C: \ OpenLDAP \ sysconf \ ldap.conf
(путь должен быть точным совпадением, поскольку он жестко запрограммированы в расширение).
Попробуйте включить «анонимные привязки» на вашем LDAP-сервере или используйте правильную привязку (имя пользователя / пароль).
например cn = ldapauthuser, ou = accounts, dc = Например, dc = com