Пятница, 19.06.2026, 16:20
Приветствую Вас Гость | RSS
Поиск по каталогу
Главная страница | Каталог статей | Регистрация | Вход

Информационные технологии
Форма входа
Меню сайта

Категории каталога
php [246]
perl [1]
perl
ASP [1]
AJAX [0]

Друзья сайта

Наш опрос
Оцените мой сайт
Всего ответов: 69

Начало » Статьи » Web программирование » php

PHP5 - Новые возможности PHP5-Zend Engine 2_0 2

Клонирование объектов


В PHP4 отсутствовала возможность определить конструктор копии, который бы выполнялся при создании копии объекта. PHP4 осуществлял побайтовое копирование объекта, создавая точные копии всех его свойств.

Данное поведение PHP4 не всегда позволяло достичь нужного результата. Хорошим примером необходимости конструктора копии является объект, представляющий GTK-окно и содержащий его ресурсы: при создании копии такого объекта, вам, скорее всего, хотелось бы создать новое окно с теми же свойствами, и получить объект, содержащий ресурсы нового окна. Еще один пример: объект хранит ссылку на другой используемый им объект, и при создании копии хотелось бы получить ссылку на новый экземпляр объекта, а не на тот же.

Для создания копии объекта, вызывается его метод __clone():


<?php
$copy_of_object
= $object->__clone();
?>


При выполнении данной операции, PHP5 сначала проверит, определен ли метод __clone(). Если он не определен, PHP вызовет метод __clone(), созданный под умолчанию, который осуществит побайтное копирование всех свойств объекта. В случае же, если метод __clone() определен, он отвечает за установку требуемых свойств создаваемой копии объекта. Для удобства, Zend Engine предоставляет функцию, импортирующую все свойства копируемого объекта, так что достаточно переопределить только те свойства, которые необходимо изменить.

Пример:


<?php
class MyCloneable {
    static
$id = 0;

    function
MyCloneable() {
       
$this->id = self::$id++;
    }

    function
__clone() {
       
$this->name = $that->name;
       
$this->address = "New York";
       
$this->id = self::$id++;
    }
}

$obj = new MyCloneable();

$obj->name = "Hello";
$obj->address = "Tel-Aviv";

print
$obj->id . "n";

$obj = $obj->__clone();

print
$obj->id . "n";
print
$obj->name . "n";
print
$obj->address . "n";
?>


Единое имя конструкторов


PHP5 позволяет определить метод-конструктор класса. Классы, имеющие конструктор, вызывают его для каждого создаваемого объекта. Обычно конструкторы используются для присваивания переменным-элементам класса начальных значений, необходимых до использования объекта.

В PHP4 конструктором явзяется метод, который называется так же, как сам класс. Так как часто необходимо вызывать конструктор базового класса из класса производного, такой принцип именования конструкторов затрудняет работу со сложной иерархией классов. Если базовый класс изменен, приходится также менять имя вызываемого конструктора базового класса в коде производного класса.

В PHP5 введен стандартный способ объявления конструктора класса. Конструктором в PHP5 является метод с именем __construct().

Пример:


<?php
class BaseClass {
    function
__construct() {
        print
"В конструкторе базового класса BaseClassn";
    }
}

class
SubClass extends BaseClass {
    function
__construct() {
       
parent::__construct();
        print
"В конструкторе производного класса SubClassn";
    }
}

$obj = new BaseClass();
$obj = new SubClass();
?>


Для обратной совместимости, предусмотрено следующее: если PHP5 не находит функцию __construct() в определении данного класса, используется старый стиль именования конструкторов. Таким образом, единственный случай несовместимости при переходе на PHP5 - присутствие в объявлении класса метода с именем __construct().

Деструкторы


Возможность объявления деструкторов может быть весьма полезной. Деструктор может вести лог отладочных сообщений, закрывать соединения с базой данных и т.п. В PHP4 отсутствовала поддержка деструкторов, хотя имелась возможность указать функцию, которая вызывается при завершении работы скрипта.

PHP5 поддерживает деструкторы, аналогично другим объектно-ориентированным языкам, таким как Java. Когда последняя ссылка на объект уничтожена, прежде, чем память, выделенная объекту, уничтожается, вызывается метод класса с именем __destruct() без каких-либо параметров.

Пример:


<php
class MyDestructableClass {
    function
__construct() {
        print
"In constructorn";
       
$this->name = "MyDestructableClass";
    }

    function
__destruct() {
        print
"Destroying " . $this->name . "n";
    }
}

$obj = new MyDestructableClass();
?>


Подобно конструкторам, деструкторы базовых классов не вызываются автоматически. Для вызова деструктора базового класса необходимо явно указать вызов метода parent::__destruct() в коде деструктора.

[fixxxer] Примечание: само собой разумеется, при портировании PHP4-скриптов возможной несовместимостью будет наличие методов __destruct(), используемых в других целях. Видимо, в связи с мизерной вероятностью такого случая разработчики не сочли нужным об этом упомянуть.

Константы-элементы класса


В PHP5 введены константы-элементы класса:


<?php
class Foo {
    const
constant = "constant";
}

echo
"Foo::constant = " . Foo::constant . "n";
?>


Существующие программы, не испольующие собственные классы или функции, названные "const", будут работать без каких-либо изменений.

Исключения (exceptions)


В PHP4 не было обработки исключений. В PHP5 реализована обработка исключений, подобно другим языкам программирования. Обратите внимание на поддержку инструкций "catch all" и "finally". Исключения можно повторно посылать из блоков catch. Также, возможно наличие нескольких блоков catch. В этом случае, полученное исключение обрабатывается первым по порядку блоком catch, instanceof которого совпадает с типом класса, экземпляром которого является исключение. При завершении работы блока catch, выполнение программы продолжается с инструкции, следующей за последним блоком catch. Если ни одного подходящего по "instanceof" блока catch не обнаружено, продолжается поиск других блоков try/catch. Если же и этот поиск не увенчается успехом, исключение считается необработанным, выводится сообщение об ошибке, и выполнение программы прерывается.

Пример:


<?php
class MyException {
    function
__construct($exception) {
   
$this->exception = $exception;
    }

    function
Display() {
    print
"MyException: $this->exceptionn";
    }
}

class
MyExceptionFoo extends MyException {
    function
__construct($exception) {
   
$this->exception = $exception;
    }

    function
Display() {
        print
"MyException: $this->exceptionn";
    }
}

try {
   
throw new MyExceptionFoo('Hello');
}
catch (MyException $exception) {
   
$exception->Display();
}
catch (Exception $exception) {
    echo
$exception;
}
?>


Несмотря на то, что вышеприведенный пример демонстрирует возможность определения исключения как элемента класса, не являющегося производным от класса Exception, так делать не рекомендуется, так как встроенный класс Exception позволяет собрать и вывести информацию, иначе недоступную. Примером использования данной возможности является нижеприведенный код, снабженный комментариями, описывающими каждое свойство и, соответственно, методы, используемые для чтения их значений. Так как некоторые методы используются для внутренних целей, они объявлены финальными (final). Вообще, в объявлении класса Exception довольно много ограничений, так как необходимо гарантировать совпадение ожидаемого результата с действительным.

Пример:


<?php
class Exception {
    function
__construct(string $message=NULL, int code=0) {
        if (
func_num_args()) {
            
$this->message = $message;
        }
       
$this->code = $code;
       
$this->file = __FILE__; // соответствует оператору throw
       
$this->line = __LINE__; // соответствует оператору throw
       
$this->trace = debug_backtrace();
       
$this->string = StringFormat($this);
    }

   
protected $message = 'Unknown exception'; // текст сообщения об исключении
   
protected $code = 0; // код исключения, определяемый пользователем
   
protected $file; // имя файла, где произошло исключение
   
protected $line; // строка, где произошло исключение

   
private $trace; // backtrace исключения
   
private $string; // только для внутреннего использования!!

   
final function getMessage() {
        return
$this->message;
    }
   
final function getCode() {
        return
$this->code;
    }
   
final function getFile() {
        return
$this->file;
    }
   
final function getTrace() {
        return
$this->trace;
    }
   
final function getTraceAsString() {
    return
self::TraceFormat($this);
    }
    function
_toString() {
    return
$this->string;
    }
    static
private function StringFormat(Exception $exception) {
       
// ... функция, недоступная из PHP-скриптов. Возвращает всю нужную информацию в виде строки.
   
}
    static
private function TraceFormat(Exception $exception) {
   
// ... функция, недоступная из PHP-скриптов.
    // возвращает backtrace в виде строки
   
}
}
?>


Если вы создадите ваши собственные классы исключений как производные от приведенного класса Exception, встроенный обработчик необработанных исключений выведет о них подробную информацию.

Существующие программы, не испольующие собственные классы или функции, названные "catch", "throw" или "try", будут работать без каких-либо изменений.

Разыменование объектов, возвращаемых функцией


В PHP4 не было возможности разыменования (dereferencing) объектов, возвращаемых фунцией. В PHP5 такая возможность введена, что позволяет вызывать методы возвращаемых объектов, оперируя непосредственно с результатом выполнения функции:


<?php
class Circle {
    function
draw() {
    print
"Circlen";
    }
}

class
Square {
    function
draw() {
        print
"Squaren";
    }
}

function
ShapeFactoryMethod($shape) {
    switch (
$shape) {
        case
"Circle":
            return new
Circle();
        case
"Square":
            return new
Square();
    }
}

ShapeFactoryMethod("Circle")->draw();
ShapeFactoryMethod("Square")->draw();
?>


Инициализация статических переменных-элементов статических классов

Пример:


<?php
class foo {
    static
$my_static = 5;
   
public $my_prop = 'bla';
}

print
foo::$my_static;
$obj = new foo;
print
$obj->my_prop;
?>


Статические методы


В PHP5 ключевое слово "static" можно использовать для определения статического метода, что позволяет вызывать метод вне контекста объекта.

Пример:


<?php class Foo {
   
public static function aStaticMethod() {
       
// ...
   
}
}

Foo::aStaticMethod();
?>


Псевдо-переменная $this внутри метода, объявленного статическим, недоступна (так как при вызове статического метода неизвестно, в контексте какого экземпляра класса ее использовать, да и вполне возможно, что на момент вызова их не существует вообще - [fixxxer]).
Категория: php | Добавил: freeone (03.06.2007)
Просмотров: 621 | Рейтинг: 0.0 |

Всего комментариев: 0
Имя *:
Email *:
Код *:

Copyright Информационные технологии © 2006