В этой статье приведен пример операции перегрузки объектно-ориентированного программирования PHP. Поделитесь для вашей справки следующим образом:
тяжелый груз
“Перегрузка” в PHP отличается от большинства других объектно-ориентированных языков, за исключением того, что все они используют одно и то же существительное. Традиционная “перегрузка” используется для предоставления нескольких классов с одинаковым именем, но параметры каждого метода различаются по типу и количеству. “Перегрузка”, предоставляемая PHP, относится к динамическому “созданию” атрибутов и методов класса. При вызове текущей среды Не определено или Невидимые Перегруженные методы вызываются при использовании атрибутов или методов класса. Это достигается магическими методами.
Вообще говоря, атрибуты членов в классе определяются как частные, что больше соответствует логике реальности и может лучше защитить членов класса. Однако очень часто приходится читать и назначать атрибуты-члены, и очень сложно определить общедоступные методы, которые могут быть получены и назначены вне объекта для каждого частного атрибута в классе. Поэтому в версиях после PHP 5.1.0 два метода “_get()” и “_set()” предопределены для завершения операции получения и назначения всех используемых частных атрибутов, а также метод “_isset ()”, используемый для проверки наличия частных атрибутов, и метод “_unset ()”, используемый для удаления частных атрибутов в объектах. Обычно перегрузка в PHP означает, что, когда объект или класс использует свои неопределенные или невидимые атрибуты и методы, некоторые из них являются “механизмами обработки”.
Переопределение свойств
Когда используется атрибут, которого нет в объекте, в этом классе предоставляется заранее определенный ответ (механизм обработки).
Атрибут-это, по сути, переменная, содержащая всего четыре операции:
Ценность:
Когда атрибут объекта не существует (неопределенный или невидимый)” имеет значение”, метод вызывается автоматически: __GET() Метод не учитывает регистр.
Назначение:
Когда атрибут несуществующего объекта (неопределенный или невидимый) “присваивается”, автоматически вызывается метод: __SET()
Иссет:
Когда isset () определяет атрибут, который не существует (неопределенный или невидимый) для объекта, метод вызывается автоматически: isset()
Уничтожение (не установлено):
Когда функция unset () определяет атрибут, который не существует в объекте (неопределенный или невидимый), метод вызывается автоматически: unset()
Эти четыре метода называются магическими методами.
Магические Методы
_ GET (имя атрибута$):
Метод вызывается автоматически, когда “значение” применяется к атрибуту, который не существует в объекте. Метод может использовать параметр для указания имени атрибута (строки), которого не существует, чтобы получить значение. Этот метод может быть использован для решения непредвиденных ситуаций особым образом.
Например:
Перегрузка PHP, используя __get() Метод “изящной обработки” вышеуказанных ошибок.
{$prop_name} attribute has not been defined (does not exist)!" ";
Return ";// Can also return 0, or false, etc.
*/
// You can also do this.
Trigger_error ("Error: Attribute does not exist! "(E_USER_ERROR);
die();
}
}
$a1 = new A();
echo $a1->p1; //1
Echo $a1 - > p2; // undefined $p2, but processed
?>Вот пример операции для получения используемых личных атрибутов.
Пример:
name = $name;
$this->sex = $sex;
$this->age = $age;
}
Private function get ($propertyName) {/// Here, use private modifier to prevent external class calls
if($propertyName == 'age'){
return $this->age;
}
}
}
$p = new Person ('yeoman','man', 23);
$v1 = $p->name;
$v2 = $p->sex;
$v3 = $p - > age; // automatically calls the _get() method to get the private property age (returned in the function definition)
echo "name=$v1, sex=$v2, age=$v3";
?>Результаты заключаются в следующем:
Имя,,
_ НАБОР ($имя атрибута, значение):
При присвоении объекту несуществующего атрибута автоматически вызывается этот внутренний магический метод; он имеет два параметра, представляющих “имя атрибута” и “значение атрибута” для присвоения несуществующего атрибута. Этот метод в сочетании с методом _GET часто может сделать классы, которые мы определяем, расширяемыми. То есть атрибуты классов или объектов могут быть более удобными и бесплатными.
Пример:
prop_list[$p] = $v;
}
function __get($p){
return $this->prop_list[$p];
}
}
$a1 = new A();
$a1 - > P1 = 1; // assignment of non-existent attribute names, at which point _set() is called and passed to "p1" and "1"
$a1->p2 = 2;
$a1->ac = 'avc';
Echo "
outputs the values of these"nonexistent attributes";
Echo "< br /> A1 - > p1:" $A1 - > p1; // the value of the attribute name that does not exist is called _get () and passed to "p1"
echo "
a1->p2:" . $a1->p2;
echo "
a1->ac:" . $a1->ac;
?>Результаты заключаются в следующем:
Выведите значения этих “несуществующих атрибутов”: a1->p1:1 a1->p2:2 a1->ac:avc
_ ISSET (имя атрибута$):
Когда атрибут для объекта не существует задан() При оценке автоматически вызываются внутренние методы: задан() ;
Использование:
$v1 = isset ($object - > nonexistent attribute); // The magic method in the class to which the object belongs is called at this time: isset ()
Пример:
prop_list[$p] = $v;
}
function __get($p){
if($this->prop_list[$p]){
return $this->prop_list[$p];
}else{
Return "This property does not exist! ";
}
}
Function _isset ($prop) {//_isset () is a custom method and isset () is a system function
$re = isset($this->prop_list[$prop]);
return $re;
}
}
$a1 = new A();
$a1 - > P1 = 1; // Assignment of non-existent attribute names calls _set() and passes "p1" and "1"
$a1->p2 = 2;
$a1->ac = 'avc';
Echo "
outputs the values of these"nonexistent attributes";
Echo "< br /> A1 - > p1:" $A1 - > p1; // the value of a non-existent attribute name is called at this time _get(), and passed to "p1"
echo "
a1->p2:" . $a1->p2;
echo "
a1->ac:" . $a1->ac;
// Here's a demonstration of isset's judgement of non-existent attributes
$v1 = isset ($a1 - > p1); // Existence
$v2 = isset ($a1 - > ppp1); // nonexistent
var_dump($v1);
echo "
";
var_dump($v2);
?>Результаты операции:
Выведите значения этих “несуществующих атрибутов” a1->p1:1 a1->p2:2 a1->ac:avc логическое значение true логическое значение false
_ НЕ УСТАНОВЛЕНО (имя атрибута$)
Когда атрибут не существует для объекта unset() При уничтожении автоматически вызываются внутренние методы: unset() ;
prop_list[$p] = $v;
}
function __get($p){
if($this->prop_list[$p]){
return $this->prop_list[$p];
}else{
Return "This property does not exist! ";
}
}
function __unset($prop){
unset($this->prop_list[$prop]);
}
}
$a1 = new A();
$a1 - > P1 = 1; // Assignment of non-existent attribute names calls _set() and passes "p1" and "1"
Echo "< br /> A1 - > p1:" $A1 - > p1; // the value of a non-existent attribute name is called at this time _get(), and passed to "p1"
// Here's a demonstration of unset destroying a non-existent property
unset($a1->p1);
echo "
a1->p1:" . $a1->p1;
?>Результаты заключаются в следующем:
a1->p1:1 A1 – > p1: Это свойство не существует!
В следующем примере объявите класс Person и установите для всех свойств членов значение private. Добавьте пользовательский в класс” __isset() “и” __unset() ” Два метода. Используйте вне класса” установлено() “и” снято() ” Эти два метода вызываются автоматически при использовании функции. Код выглядит следующим образом:
name = $name;
$this->sex = $sex;
$this->age = $age;
}
Private function _isset ($propertyName) {// Requires a parameter, which is the name of the private attribute determined
if($propertyName == 'name'){
Return false; // Return false, not allowing the name attribute to be determined outside the class
}
Return isset ($this - > $propertyName); // Here propertyName needs to add a $character, because this is a parameter, not an attribute
}
private function __unset($propertyName){
if($propertyName == 'name')
Return; // Exit method, which does not allow deletion of the name attribute in the object
Unset ($this - > $propertyName); // Here propertyName is added with a $character
}
public function say(){
Echo: "Name:" $this - > name. ", $this - > sex.", $this - > age. "
";
}
}
$person = new Person ("yeoman", "man", 23);
Var_dump (isset ($person - > name); // output bool (false), not allowing the determination of name attribute
Var_dump (isset ($person - > sex); // output bool (true), with sex private attributes
Var_dump (isset ($person - > age); // output bool (true), with age private attributes
Var_dump (isset ($person-> id)); // output bool (false), no ID attribute exists in the measured object
Unset ($person - > name); // Delete the private attribute name, but it is not allowed to delete in _unset ()
Unset ($person - > sex); /// Delete the private property sex in the object successfully
unset($person->age);
Person - > say (); // The sex and age attributes in the object are deleted and output: name: yeoman, gender: age:
?>Результаты операции:
логическое ложное логическое истинное логическое истинное логическое ложное Имя: йомен, пол: возраст:
Перегрузка
Когда вызывается метод экземпляра, который не существует для объекта, класс автоматически вызывается __call() Этот волшебный метод;
Когда вызывается статический метод, который не существует в классе, он автоматически вызывает метод в классе. __callstatic() Это волшебный трюк.
Пример: Прямой вызов несуществующих методов
F1 (); // non-existent method ?>
Об ошибках будет сообщено. Содержание ошибок выглядит следующим образом:
Фатальная ошибка: Неперехваченная ошибка: Вызов неопределенного метода A::f1()
“Элегантное обращение” с вышеуказанной ошибкой:
F1 (); // / nonexistent method, but processed ?>
Результаты заключаются в следующем:
Метод F1 () не существует!
Когда вызывается статический метод, который не существует в классе, он автоматически вызывает метод в классе. __callstatic() Это волшебный трюк. Аналогично описанной выше обработке.
Больше читателей, интересующихся контентом, связанным с PHP, могут ознакомиться с темами этого сайта: Введение в объектно-ориентированное программирование Php, Введение в навыки работы с массивами PHP, Введение в базовую грамматику PHP, Краткое описание работы PHP и использования операторов, Краткое описание использования строк Php и данных php+mysql. Введение в библиотечные операции и Краткое описание общих навыков работы с базами данных на PHP
Я надеюсь, что эта статья будет полезна для разработки PHP – программ для всех.