Помимо ограничения доступа, метод доступа также определяет, какой метод будет вызываться подклассом или к какому свойству будет обращаться подкласс. Связь между вызовами функций и самой функцией, а также связь между доступом к членам и адресами памяти переменных. называется привязкой.
В компьютерных языках существует два основных типа привязки — статическая привязка и динамическая привязка. Статическая привязка происходит между структурами данных и структурами данных до выполнения программы. Статическая привязка происходит во время компиляции и поэтому не может использовать какую-либо информацию времени выполнения. Он нацелен на вызовы функций и тело функции, а также на переменные и блоки памяти. Поскольку PHP — динамический язык, он не использует статическую привязку. Но статическое связывание можно смоделировать.
Динамическая привязка использует только доступную информацию во время выполнения для запросов доступа, созданных во время выполнения. В объектно-ориентированном коде динамическое связывание означает, что решение о том, какой метод вызывается или к какому свойству осуществляется доступ, будет основано на самом классе, а не на области доступа.
Действия открытых и защищенных членов аналогичны действиям функций в предыдущих версиях PHP с использованием динамической привязки. Это означает, что если метод обращается к члену класса, который переопределен в подклассе и является экземпляром подкласса, будет получен доступ к члену подкласса (вместо доступа к члену родительского класса).
Посмотрите на пример 6.10. Этот код выводит «Эй! Я Сын». Потому что, когда PHP вызывает getSalutation, это экземпляр Son, который перезаписывает приветствие в Father. Если приветствие публичное, PHP генерирует тот же результат. работа переопределенного метода очень похожа. В Son вызовы идентификации привязаны к этому методу.
Даже если в подклассе метод доступа будет ослаблен с защищенного на общедоступный, динамическое связывание все равно произойдет. Согласно принципу использования методов доступа невозможно усилить ограничения доступа к членам класса, поэтому измените метод доступа с общедоступного на общедоступный. защищенный не может продолжаться.
Листинг 6.10. Динамическое связывание.
Класс динамического связывания Father.
{
protected $salutation = "Привет!" //Привет,
public function getSalutation();
{
print("$this->приветствиеn");
$this->identify();
}
защищенная функция идентификации()
{
print("Я Отец.
н");
}
};
класс Сын расширяет Отец
{
protected $salutation = "Эй!"; //защищенное $salutation в родительском классе перезаписано
protected functionident() //защищенное идентификация() в родительском классе перезаписано
{
print("Я Сын.
н");
}
}
$объект = новый сын();
$obj->getSalutation(); //Вывод Привет!
?>
//Примечание: getSalutation() не переопределяется в подклассе, но на самом деле в этом классе все еще есть getSalutation() и идентификации().
//Динамически привязан к методу getSalutation() в экземпляре подкласса Son, поэтому вызывается метод getSalutation() экземпляра Son,
//Приветствие члена и метод идентификации() в классе Son будут вызываться вместо приветствия члена и метода идентификации() в родительском классе.
Частные члены существуют только внутри класса, в котором они расположены. В отличие от открытых и защищенных членов, PHP. имитирует статическую привязку. См. пример 6.11. Он печатает «Привет! Я Отец». Хотя подкласс перезаписывает значение приветствия, сценарий связывает this->приветствие с текущим классом Father. Аналогичный принцип применяется к закрытому методу идентификации().
Листинг 6.11. Привязка и закрытые члены
класса Father
{
Private $salutation = "Привет!";
публичная функция getSalutation();
{
print("$this->приветствиеn");
$this->identify();
}
частная функция идентификации()
{
print("Я Отец.
н");
}
}
класс Сын расширяет Отец
{
Private $salutation = "Привет!";
частная функция идентификации()
{
print("Я Сын.
н");
}
}
$obj = новый сын ();
$obj->getSalutation(); //Вывод Привет, я отец.
?>
Преимущество динамического связывания состоит в том, что оно позволяет унаследованным классам изменять поведение родительского класса, сохраняя при этом интерфейс и функции родительского класса. См. пример 6.12. Из-за использования динамического связывания вызывается версия isAuthorized. deleteUser может определяться типом объекта. Если это обычный пользователь, PHP-вызов User::isAuthorized вернет FALSE. Если это экземпляр AuthorizedUser, PHP-вызов AuthorizedUser::isAuthorized позволит выполнить deleteUser плавно.
//haohappy Примечание. Если выразить это в одном предложении, это тип объекта и метод, привязка атрибута. При вызове метода, который существует как в родительском классе, так и в подклассе, или при доступе к атрибуту, он сначала определяет, какой тип объекта является принадлежит экземпляр, а затем вызовите методы и свойства соответствующего класса.
Листинг 6.12. Преимущества
класса динамической привязки User //User.
{
защищенная функция isAuthorized() //Независимо от того, является ли это аутентифицированным пользователем
{
возврат (ЛОЖЬ);
}
public function getName() //Получаем имя
{
возврат ($ это-> имя);
}
Публичная функция deleteUser($username) //Удалить пользователя
{
if(!$this->isAuthorized())
{
print("Вы не авторизованы.
н");
возврат (ЛОЖЬ);
}
//удаляем пользователя
print("Пользователь удален.
н");
}
}
Класс AuthorizedUser расширяет пользователя //Аутентификация пользователя
{
защищенная функция isAuthorized() //перезаписать isAuthorized()
{
возврат (ИСТИНА);
}
}
$user = новый пользователь;
$admin = новый авторизованный пользователь
//не авторизован
;
$user->deleteUser("Зеев");
// авторизовано
$admin->deleteUser("Зеев");
?>
Почему частные члены класса имитируют статическую привязку? Чтобы ответить на этот вопрос, вам нужно вспомнить, почему вам нужны закрытые члены. Когда имеет смысл использовать их вместо защищенных членов,
только если вы этого не хотите
?наследуемые подклассы Используется только при изменении или специализации поведения родительского класса. Это встречается реже, чем вы думаете. Вообще говоря, хорошая иерархия объектов должна позволять специализировать, улучшать или изменять большую часть функциональности с помощью подклассов. основ объектно-ориентированного программирования. Частные методы или переменные необходимы в определенных ситуациях, например, когда вы уверены, что не хотите, чтобы подкласс изменял определенную часть родительского класса.