+38(044) 277-40-42
+38(063) 233-01-83
+38(044) 277-42-05
+38(063) 233-01-83

Изучаем новые технологии PHP

Учитывая, что язык программирования PHP на сегодняшней день является крайне популярной технологией программирования серверной части сайтов, а также то, что версия PHP 4, по утверждениям многих, была революционной по сравнению с предыдущими, новая пятая по счету версия вызывает обоснованный интерес среди веб-разработчиков. Однако, по словам создателей PHP 5, ничего революционного в этот раз ожидать не стоит - текущие изменения носят всего лишь ”эволюционный” характер. Тем не менее, сделанные дополнения являются давно ожидаемыми, крайне полезными и весьма своевременными. В первую очередь переработке подвергся весь механизм работы с объектами. И если в предыдущих версиях объектно-ориентированное программирование на PHP было возможно в минимальной степени, из-за чего и использовалось на практике не часто, то PHP 5 обладает великолепным потенциалом реализации объектного программирования. Кроме этого, PHP обогатился рядом ценных расширений для работы с XML, различными источниками данных, генерации графики и пр.
Изучаем новый механизм работы с объектами
Основное отличие обработки объектов в PHP 5 от PHP 4 заключается в том, что теперь присвоение объекта или его передача в качестве параметра функции происходит по умолчанию по ссылке, а не по значению, как в предыдущей версии. И если в PHP 4 объекты обрабатывались также как и простые типы данных, что часто приводило к появлению нескольких копий одного и того же объекта, то в PHP 5 такого не происходит, так как каждый объект получает свой собственный числовой идентификатор (handle), который и используется при обращении к объекту. Таким образом, представленный ниже код, выполненный в PHP 4 и в PHP 5, очевидно может продемонстрировать различия в обработке объектов.<?php      class MyClass {         var $property;     }      $obj1 = new MyClass;     $obj1->property = 1;     $obj2 = $obj1;     $obj2->property = 2;     echo $obj1->property; // Выводит 1 в PHP 4 и 2 в PHP 5     echo $obj2->property; // Выводит 2?>В PHP 4 $obj2 представляет собой копию объекта $obj1, а в PHP 5 и $obj1 и $obj2 указывают на один и тот же объект, так как оператор $obj2 = $obj1 копирует не сам объект, а только его идентификатор.Различные механизмы обработки объектов имеют место по причине того, что Zend Engine 1, исполнявший сценарии в PHP 4, хранил значения всех типов одинаковым образом в специальной структуре, называемой zval (Zend VALue). В PHP 5 также используется zval, однако теперь в нем хранятся все типы данных, за исключением объектов, которые располагаются в новой структуре, получившей название Object Store. Zval же хранит только идентификаторы объектов, вот почему при присвоении или передачи в функцию передается не сам объект, а только его идентификатор.Данное улучшение позволит значительно увеличить производительность PHP сценариев, где активно используется работа с объектами.
Курсы программирование PHP. Изучаем механизм клонирование объектов
Итак, в PHP 5 объекты передаются по ссылке. Однако, если же необходимо провести именно копирование объекта, как это делалось в PHP 4, то в PHP 5 придется явно использовать новый метод __clone(). При этом объект копируется со всеми своими методами, свойствами и их значениями:<?php      class MyClass{         var $property;     }      $obj1 = new MyClass;     $obj1->property = 1;     $obj2 = clone $obj1;     echo $obj1->property; // Выводит 1     echo $obj2->property; // Выводит 1     $obj2->property = 2;     echo $obj2->property; // Выводит 2?>Следует обратить внимание на то, что к методу __clone() нельзя обратиться непосредственно и для копирования объекта используется ключевое слово clone.Метод __clone() необязательно описывать в самом классе, однако его явное определение, т.е. перегрузка, позволит изменить значения свойств копируемого объекта:<?php      class MyClass{         var $property;         function __clone() {             $this->property = 2;          }     }      $obj1 = new MyClass;     $obj1->property = 1;     $obj2 = clone $obj1;     echo $obj1->property; // Выводит 1     echo $obj2->property; // Выводит 2?>Метод __clone() не может принимать никакие аргументы, однако позволяет обратиться к исходному объекту через указатель $this и получаемому в результате копирования объекту через указатель $that. 
Изучаем доступность элементов класса
В PHP 5 введены спецификаторы доступаpublic, protected и private, которые позволяют указать степень доступа к свойствам и методам класса. К общедоступным (public) свойствам и методам можно получить доступ без каких либо ограничений. Защищенные (protected) элементы класса доступны внутри класса, в котором они объявлены, и в производных от него классах. Частные (private) элементы доступны только в классе, в котором они объявлены. <?php      class MyClass {         public $public = "общедоступный элемент";         protected $protected = "защищенный элемент";         private $private = "частный элемент";          public function printPrivate() {             echo $this->private;          }     }      $obj1 = new MyClass;     echo $obj1->public; // Выводит "общедоступный элемент"       class MyClass1 extends myClass {         public function printProtected() {             echo $this->protected;          }     }      $obj2 = new MyClass1();     $obj2->printProtected(); // Выводит "защищенный элемент"      $obj1->printPrivate(); //Выводит "частный элемент"      echo $obj1->protected; // Вызывает ошибку доступа      echo $obj1->private; // Вызывает ошибку доступа?>Если не указывать ни один из спецификаторов, то по умолчанию элемент будет иметь уровень доступа public. Такой же уровень доступа получают свойства, для объявления которых использовалось устаревшее и не рекомендуемое к использованию в PHP 5 ключевое слово var.
Изучаем конструкторы и деструкторы
Метод-конструктор вызывается автоматически при каждом создании объекта. И хотя конструктор появился в PHP давно (эту роль выполнял метод, названный именем класса), но в PHP 5 была изменена схема именования конструктора - метод __construct() является теперь конструктором класса. Аналогично, при уничтожении объекта вызывается специальный метод __destruct() – деструктор класса. <?php      class MyClass {         function __construct() {             echo "Запущен конструктор";         }         function __destruct() {             echo "Запущен деструктор";         }      }      $obj = new MyClass(); // Выводит "Запущен конструктор"     unset($obj); // Выводит "Запущен деструктор"?>Если же необходимо вызвать конструктор или деструктор базового класса, то необходимо это делать явно, через указатель parent.<?php      class MyClass {         function __construct() {             echo "Запущен конструктор базового класса";         }         function __destruct() {             echo "Запущен деструктор базового класса";         }      }      class MyClass1 extends MyClass {        function __construct() {            parent::__construct();        }        function __destruct() {            parent::__destruct();        }     }      $obj = new MyClass1(); // Выводит "Запущен конструктор                                        // базового класса"    unset($obj); // Выводит "Запущен деструктор базового класса"?>Для целей совместимости с предыдущей версией PHP 5 поступает следующем образом: если при создании объекта в классе не найдет конструктор __construct(), то PHP пытается выполнить метод, имя которого совпадает с именем класса.  Т.о. конструкторы PHP 4 будут работать с PHP 5 без каких-либо изменений кода.      final class MyClass {          // Код описания класса      }       // Следующий код вызывает ошибку       // порождения от финального класса      class MyClass1 extends MyClass {          // Код описания класса      }?>Если класс определен как final, то и все методы данного класса автоматически становятся финальными, таким образом, определять их явно как final уже нет необходимости. Определять же свойства класса как финальные – недопустимо.