| 
Введение в PHP5
	Данил Миронов
 
 Оригинал статьи: http://www.phpbuilder.com/columns/argerich20030411.php3 PHP5 ещё официально не вышел, но "рабочие" версии уже трудоспособны (равно как и нестабильны!), так что мы вполне можем начать изучение новых возможностей грядущего релиза PHP и попрактиковать с ними. В этой статье мы поговорим о трёх основных нововведениях в PHP5: 
 Но сначала пара официальных заявлений: 
 PHP5 ещё не выпущен и мне неизвестно, когда это произойдёт, но уже сейчас вы можете потестировать и изучить новые возможности языка, скачав рабочую версию PHP5 с http://snaps.php.net и установив её. По этой ссылке вы можете найти готовые для установки Windows и Linux версии PHP5. Инсталляция проходит как у любого нормального релиза PHP, так что все бегом за новой игрушкой. Новая объектная модельВ PHP5 объектную модель основательно подлатали и добавили много новых возможностей, благодаря чему PHP5 стал "чем-то" напоминать Java. В этой части нашей статьи будет описана эта новая объектная модель и приведено несколько небольших примеров, чтобы вам обозначить исходный рубеж для ваших экспериментов. 
 Конструкторы и деструкторыВ PHP4 конструктор именуется так же как и сам класс, а деструкторы отсутствуют полностью. В PHP5 конструктор класса именуется __construct, а деструктор - __destruct. 
 Пример 1: Конструкторы и деструкторы function __construct ( $x ) {  function display () {  function __destruct () {  $o1 = new foo ( 4 );  Как вы видите, деструктор вызывается перед самым уничтожением класса. Объекты как ссылкиКак вам уже наверняка известно, в PHP4 переменные передаются в функции/методы по значению (передаётся копия), если в объявлении функции не поставлен символ '&', указывающий на то, что переменная должна передаваться как ссылка. В PHP5 объекты передаются всегда как ссылки. Присваивание объектов тоже происходит по ссылке. 
 Пример 2: Объекты как ссылки function setX ( $x ) {  function getX () {  $o1 = new foo ;  Клонирование объектовЕсли объекты присваиваются и передаются по ссылке, то вам нужно как-то создавать и копии объектов. Для этого используйте метод __clone. 
 Пример 3: Клонирование объектов function setX ( $x ) {  function getX () {  $o1 = new foo ;  if( $o1 -> getX () != $o2 -> getX ()) print( "Копии взаимонезависимы" );  В программировании клонирование разрешено, так что всё легально ;-) Дескрипторы Private, Public и ProtectedВ PHP4 все методы и переменные внутри объекта были доступны извне, другими словами все методы и переменные всегда были открытыми. В PHP5 вводится три дескриптора для осуществления контроля над доступом к переменным и методам: Public, Protected и Private. 
 
 Пример 4: Public, protected and private public function public_foo () {  protected function protected_foo () {  private function private_foo () {  class foo2 extends foo {  $x = new foo ();  $x2 = new foo2 ();  Совет разработчикам: Переменные класса всегда следует делать закрытыми, прямой доступ к переменным - не очень хорошая практика в ООП, лучше всего для доступа/изменения переменных класса определять специальные методы. ИнтерфейсыКак вы знаете, PHP4 поддерживает наследование классов синтаксисом "class foo extends parent". В PHP4 И в PHP5 класс может наследовать только один класс, то есть множественное наследование не поддерживается. Интерфейсом называется класс, в котором не реализуется ни один метод, определяются только названия методов и набор передаваемых им параметров. Впоследствии классы могут 'реализовывать' сколь угодно много интерфейсов, показывая тем самым, что тот или иной класс реализует методы, определённые в интерфейсе. 
 Пример 5: Интерфейсы interface printable {  class foo implements displayable , printable {  function doprint () {  Использование интерфейсов полезно для более удобного чтения и понимания кода: прочитав объявление класса, мы увидим, что класс реализует интерфейсы displayable и printable; это означает, что класс должен иметь методы display() и doprint(). Как эти методы реализованы - значения не имеет, главное - уже из объявления класса, вы знаете, что можете вызывать эти методы. Абстрактные классыАбстрактным называется класс, который может использоваться только как базовый (то есть создавать объекты этого класса нельзя). Как и в любом нормальном базовом классе, в абстрактном классе вы можете определять методы и переменные. В абстрактном классе также можно определять абстрактные методы: методы, которые не реализованы в абстрактном классе, но которые обязательно должны быть реализованы в производных классах. 
 Пример 6: Абстрактные классы abstract function display (); 
 function setX ( $x ) {  class foo2 extends foo {  __callС PHP5 вы можете реализовать в классе специальный метод __call(), как метод для "отлова" всех нереализованных в данном классе методов. Метод __call (если он определён) вызывается при попытке вызвать недоступный или несуществующий метод. 
 Пример 7: __call function __call ( $name , $arguments ) {  $x = new foo ();  Этот специальный метод может быть использован для реализации перегрузки методов: вы можете исследовать полученные аргументы и в зависимости от результата вызвать подходящий для данного случая закрытый метод, например: 
 Пример 8: Перегрузка методов с помощью __call function __call ( $name , $arguments ) {  private function foo_for_int ( $x ) {  private function foo_for_string ( $x ) {  $x = new Magic ();  __set и __getНо это ещё не всё, теперь вы можете определить методы __set и __get для "отлова" всех попыток изменения или доступа к неопределённым (или недоступным) переменным. 
 Пример 9: __set и __get function __set ( $name , $val ) {  function __get ( $name ) {  $x = new foo ();  Указание типов для аргументовВ PHP5 вы сможете "сказать" методу, что он должен получить в качестве аргумента объект определённого типа. 
 Пример 10: указание типов class bar {  $b = new bar ();  Как вы заметили, перед именем аргумента теперь можно поставить имя его класса, и таким образом PHP5 определит, что переменная $foo должна быть класса foo. Статические члены классаСтатические члены и статические методы могут использоваться для реализации того, что в ООП называется "методы класса" и "переменные класса". "Статическим методом класса" называют метод, который можно вызвать без создания объекта этого класса.  
 Пример 11: методы класса и переменные класса static public function add ( $x , $y ) {  $s = calculator :: $pi ;  ИсключенияИсключения - это общепринятый подход к обработке ошибок и неожиданных ситуаций в таких языках как Java и C++; в PHP5 перехват исключений реализован с помощью пары "try" - "catch". 
 Пример 12: Исключения function divide ( $x , $y ) {  $x = new foo (); 
 try {  Как вы видите, "try" используется для обозначения блока, в котором находятся ошибки, обрабатываемые оператором "catch", стоящим в конце блока. В блоке "catch" вам нужно реализовать вашу собственную политику обработки ошибок. В итоге получаем удобочитаемый код и всего один блок обработки ошибок.  Исключения, определённые пользователемДля обработки непредвиденных проблем в ваших программах вы можете определить ваши собственные исключения. Всё, что вам нужно - это просто дополнить (extend) класс Exception, определив конструктор класса и метод getMessage. 
 Пример 13: Исключения, определённые пользователем private $data ; 
 function WeirdProblem ( $data ) {  function getMessage () {  Потом, для возбуждения определённого вами исключения используйте конструкцию throw new WeirdProblem($foo); если исключение происходит внутри блока try{}, то PHP5 передаст управление в "catch"-блок для обработки. Пространства имёнВ целях удобства классы и функции могут быть сгруппированы в пространства имён (namespaces). Примечение: разработчики отказались от поддрежки этой возможности. 
 Пример 14: Пространство имён class Complex {  $m = new Math :: Complex ();  Обратите внимание на синтаксис использования именного пространства для обозначения класса, объект которого мы создаём. Пример практического применения: создание одноимённых классов в разных именных пространствах; при этом классы делают отличную друг от друга работу (имея одинаковый интерфейс). 
 Страница сайта http://silicontaiga.ru 
Оригинал находится по адресу http://silicontaiga.ru/home.asp?artId=5285  |