Как вы, наверное, знаете, новые возможности ООП в PHP 5 принести новые перспективы для PHP приложений. В
этой статье вы увидите новый PHP 5 особенности в отношении конструкторы
и деструкторы, которые являются одним из наиболее важных аспектов в
любой тип объектно-ориентированное класса. Напомним,
что конструктор специальные функции класса, который автоматически
выполняется, когда объект класса получает экземпляр. Деструктор специальные функции класса, что автоматически выполняется, когда объект должен быть уничтожен.
Статья начинается с краткого обзора PHP 5 конструкторов, по сравнению со старой моде PHP 4. Он
по-прежнему с объяснением написания конструкторов с параметрами или без
них, ограничительных конструкторов, перегрузки и PHP 5 деструкторов. В конце концов, вы сможете писать практически любой конструктор для PHP 5 классов.
PHP 5 vs PHP 4 Конструкторы
Как
разработчик, каждый раз при попытке узнать что-то новое (технологии,
дизайн модели, парадигмы и т.д.) вы начинаете, глядя на то, что вы
использовали в прошлом, и пытаясь определить преимущества новой
концепции. Этот подход может сказать вам, при использовании PHP 5 конструкторов стоит вашего времени. С этой целью рассмотрим следующее сравнение, который исследует, почему PHP 5 конструкторов превосходят PHP 4:
* PHP 5 вводится новый единый конструктор / деструктор имена. В
PHP 4, конструктор не только метод, который был тем же именем самого
класса, это общий подход во многих языках программирования. Основным вопросом здесь является то, что каждый раз, когда вы переименовать класс необходимо переименовать конструктор также.
* В PHP 5 все конструкторы именем __construct () (то есть, слово построить префиксом два подчеркивания).
* PHP 5 вводится вновь __destruct (), которая является уничтожение префиксом два подчеркивания. Это
позволяет писать код, который будет выполняться при уничтожении
объекта, и это автоматически вызывается; родителей деструкторы не будут
вызваны в двигателе, и она должна явно вызывать parent:: __destruct
() в деструкторе тела.
*
Для обратной совместимости, если PHP 5 не может обнаружить __construct
() для данного класса, он будет искать в старом стиле конструктора
функции имя класса, начиная с PHP 5.3.3. Методы с тем же именем, как последний элемент пространства имен имя класса больше не будет рассматриваться как конструкторы.
Вот некоторые важные примечания, касающиеся конструкторы и деструкторы из документации PHP:
* Родитель конструкторы не вызываются ребенка класс определяет конструктор. Для того чтобы запустить родительский конструктор, вызов parent:: __construct () в конструктор ребенка не требуется.
* Деструкторы вызываются во время скрипт выключения есть HTTP заголовки уже отправлены. Рабочий каталог в фазе сценарий завершения работы могут быть различными с некоторыми видами SAPI (например, Apache).
* Попытка бросить исключение из деструктора (так называемый во времена сценарий прекращения) приводит к фатальной ошибке.
* Деструктор не может принимать какие-либо аргументы.
Ваш первый PHP 5 Конструктор
Давайте начнем с основных пример PHP 5 конструктор без аргументов. Его работа будет заключаться в создании экземпляра этого класса и для инициализации набора свойств класса. Посмотрите в код, чтобы получить первое впечатление от происходящего.
class Player { private $name; private $surname; private $country; private $atp;
//this is a simple PHP 5 constructor public function __construct() { $this->name = "empty"; $this->surname = "empty"; $this->country = "empty"; $this->atp = 0; }
public function setDetails($name, $surname, $country, $atp) { $this->name = $name; $this->surname = $surname; $this->country = $country; $this->atp = $atp; }
public function displayDetails() { echo "Name : " . $this->name . " Surname: " . $this->surname . " Country: " . $this->country . " Atp Ranking: " . $this->atp . " "; } }
$player_1 = new Player(); $player_1->displayDetails(); $player_1->setDetails("Rafael", "Nadal", "ESP", 1); $player_1->displayDetails(); ?>
полужирным код представляет PHP 5 единого конструктора. Тело конструктора инициализирует четыре класса свойств со значениями по умолчанию, а нужные значения передаются функции setDetails. Обратите внимание на использование $this ключевое слово, чтобы указать, что вы будете инициализировать свойства класса, а не локальные свойства. вывод из этого класса показано на рисунке 1 ниже.
Написание PHP 5 конструктор с параметрами Как правило, нужные значения устанавливаются внутри конструктора, который гораздо ближе к реальным делам. При создании экземпляра класса, вы также установить свойства объекта. код похож на один выше; лишь разницей, что вам устранить setDetails метод и передать свое поведение, чтобы единую конструктора: class Player { private $name; private $surname; private $country; private $atp; //this is a constructor with parameters public function __construct($name, $surname, $country, $atp) { $this->name = $name; $this->surname = $surname; $this->country = $country; $this->atp = $atp; }
public function displayDetails() { echo "Name : " . $this->name . " Surname: " . $this->surname . " Country: " . $this->country . " Atp Ranking: " . $this->atp . " "; } }
$player_1 = new Player("Rafael", "Nadal", "ESP", 1); $player_1->displayDetails(); $player_2 = new Player("Roger", "Federer", "SUI", 2); $player_2->displayDetails(); ?>
Этот вид конструктора является наиболее распространенным в реальных приложениях. Он получает множество параметров - которые имеют те же имена, как свойства класса - и использует $this ключевое слово, чтобы ассоциировать каждого класса свойства надлежащего параметра. вывод из этого класса показано на рисунке 2.
Ваш первый PHP 5 Destructor Если конструктор отвечает за создание объектов, деструктор несет ответственность за разрушение объектов. деструктор обеспечивает удобный способ для выполнения необходимых операций очистки, такие как отключение внутренних объектов класса, закрытие соединения с базой данных или сокет соединения и т.д. деструктор вызывается автоматически, когда объект должен быть уничтожен. объект класса уничтожается, когда:
* он выходит из области видимости * Вы определенно установить его в нуль * Вы вернуть его или выполнение программы по
деструктор ниже звонки отключенное метод класса собственности передается в качестве аргумента:
class Player { private $name; private $surname; private $country; private $atp; public function __construct($name, $surname, $country, $atp) { $this->name = $name; $this->surname = $surname; $this->country = $country; $this->atp = $atp; } public function displayDetails() { echo "Name : " . $this->name . " Surname: " . $this->surname . " Country: " . $this->country . " Atp Ranking: " . $this->atp . " "; }
public function __destruct() { unset($this->name); unset($this->surname); unset($this->country); unset($this->atp); echo("Object destroyed ..."); } }
$player_1 = new Player("Rafael", "Nadal", "ESP", 1); $player_1->displayDetails(); $player_2 = new Player("Roger", "Federer", "SUI", 2); $player_2->displayDetails(); ?> вывод из этого класса показано на рисунке 3.
Here are some important notes regarding destructors from the PHP documentation:
- Attempting to throw an exception from a destructor (called in the time of script termination) causes a fatal error.
- A destructor cannot take any arguments.
Ограничительные конструкторов показаться сложным, но они на самом деле просто. ограничительные конструктор ничего, кроме регулярного метода конструктора, чей уровень видимости защищен или частных. Эта функция может быть необходимо в ряде случаев, но два из наиболее известными являются:
* осуществление определенных шаблонов проектирования создания, таких Синглтон и завод * Строительство классов, которые предназначены для использования вне контекста объекта
Например, конструктор для класса Singleton должны быть определены, как показано ниже (как частные, в данном случае):
//Locked down the constructor, therefore the class cannot be externally instantiated private function __construct() { }
Хотя этот конструктор закрывается, класс поддерживает один экземпляр через метод следующим образом:
//A static member variable representing the class instance private static $_instance = null; public static function getInstance() { //or if(is_null(self::$_instance)) or if(self::$_instance == null) if(!is_object(self::$_instance)) self::$_instance = new self; //or, in PHP 5.3.0 or newer //if (empty(static::$_instance)) { // $class = get_called_class(); // static::$_instance = new $class; //}
return self::$_instance; }
PHP 5 Конструктор Перегрузка
Перегрузка конструкторов является общей задачей, как правило, осуществляется несколько конструкторов с тем же именем, как класс, но с различным числом / типы аргументов. Это невозможно с PHP 5, поскольку она не поддерживает конструктор перегрузки. Однако, вы можете импровизировать использованием __call метод.
Для тех, кто не знаком с PHP 5 _call метод, предположим, что в случае перегрузки методов, код определяет метод, который действует в качестве шаблона для звонков на неопределенный методов соответствующего класса. Этот шаблон будет вызван метод только тогда, когда класс не содержит метод, который вы пытаетесь получить доступ. Использование магии __call () вы можете разработать следующий код:
class Player { private $name; private $surname; private $country; private $atp;
public function __construct() { $num = func_num_args(); $args = func_get_args(); switch($num){ case 0: $this->__call('__construct_0', null); break; case 1: $this->__call('__construct_1', $args); break; case 2: $this->__call('__construct_2', $args); break; case 3: $this->__call('__construct_3', $args); break; case 4: $this->__call('__construct_4', $args); break; default: throw new Exception(); } }
public function __construct_0() { echo "constructor 0" . " "; }
public function __construct_1($name) { $this->name = $name; echo "constructor 1: " . $this->name . " "; }
public function __construct_2($name, $surname) { $this->name = $name; $this->surname = $surname; echo "constructor 2: " . $this->name . "|" . $this->surname . " "; }
public function __construct_3($name, $surname, $country) { $this->name = $name; $this->surname = $surname; $this->country = $country; echo "constructor 3: " . $this->name . "|" . $this->surname . "|" . $this->country . " "; }
public function __construct_4($name, $surname, $country, $atp) { $this->name = $name; $this->surname = $surname; $this->country = $country; $this->atp = $atp; echo "constructor 4: " . $this->name . "|" . $this->surname . "|" . $this->country . "|" . $this->atp . " "; }
private function __call($con, $arg) { return call_user_func_array(array($this, $con), $arg); } }
$player_1 = new Player("Rafael"); $player_2 = new Player("Rafael", "Nadal"); $player_3 = new Player("Rafael", "Nadal", "ESP"); $player_4 = new Player("Rafael", "Nadal", "ESP", "1"); ?>
Ну, у вас есть несколько интересных вещей. Приложение
запускается, когда экземпляр класса игрока создается (этот код потока
же для каждого из четырех экземпляров) и заканчивается, когда экземпляр
свойств задаются прошло значения. Когда создается экземпляр, __construct () вызывается конструктор. Этот
конструктор вызывается независимо от того, сколько аргументов вы
передаете его в качестве стартовой точки для создания нового экземпляра.
Этот
конструктор действует как один общий, и несет ответственность за
направление инициализации нового объекта в четыре метода, названного
__construct_number_of_arguments ().
Для выполнения диспетчерской, конструктор потребностей magic __call () метод, который получает два аргумента. Первым аргументом является имя оригинальный метод (в некоторых случаях это может быть ненайденных метод, но в данном случае). Вторая одномерно, численно индексированный массив, содержащий все аргументы в пользу оригинальной методике.
Вызов определенный / неопределенный метод с двумя аргументами, Rafael и Nadal , приведет в следующий массив:
Array ( [0] => Rafael [1] => Nadal )
Далее, __call () будет вызывать оригинальный метод и передать набор аргументов. В этот момент поток выполнения в поддельных перегруженный конструктор, в зависимости от количества аргументов. Отсюда тривиально код инициализирует новых свойств объекта и выводит проверки сообщения. Это сообщение должно быть удалено и методы получения и установки должны быть использованы вместо. Выход из этого класса показано на рисунке 4.
Заключение
В этой статье вы изучили наиболее важные аспекты новый конструктор / деструктор механизм доступна с PHP 5 новых возможностей ООП. Вы видели, как писать простые конструкторы / деструкторы и ограничительные конструкторов, и как для имитации перегрузки механизма, который не доступен в PHP 5
источник:http://www.phpbuilder.com/columns/PHP5-constructors-dest
|