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