Что нового в РНР 5

Автор статьи: softportal.com
Сайт Автора: www.softportal.com
E-mail Автора: нет
Дата публикации: 18.01.2006


Новое в объектно-ориентированном подходе

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

Ниже представлен обзор главных изменений:

  1. public/private/protected - модификаторы доступа для методов и свойств

    Позволяют управлять доступом к методам и свойствам.

    <?php
    class MyClass {
        
    private $id = 18;

        
    public function getId() {
            return
    $this->id;
        }
    }
    ?>

  2. Унифицированный конструктор __construct()

    Конструктор, ранее совпадавший с названием класса, теперь необходимо объявлять как __construct(), что позволит легче перемещать классы в иерархиях.

    <?php
    class MyClass {
        function
    __construct() {
            print
    "Inside constructor";
        }
    }
    ?>

  3. Поддержка деструктора для класса, определяемого как метод __destructor()

    Позволяет определить функцию деструктора, которая будет выполнена при уничтожении объекта.

    <?php
    class MyClass {
        function
    __destruct() {
            print
    "Destroying object";
        }
    }
    ?>

  4. Интерфейсы

    Класс может наследовать только один класс, но при этом может иметь столько интерфейсов, сколько потребуется.

    <?php
    interface Display
    {
        function
    display();
    }

    class
    Circle implements Display {
        function
    display() {
            print
    "Displaying circle ";
        }
    }
    ?>

  5. Оператор instanceof

    Поддержка проверки зависимости от других объектов. Функцией is_a(), известной из PHP 4, пользоваться теперь не рекомендуется.

    <?php
    if ($obj instance of Circle) {
        print
    '$obj is a Circle';
    }
    ?>

  6. Метод final

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

    <?php
    class MyClass {
        
    final function getBaseClassName() {
            return
    __CLASS__;
        }
    }
    ?>

  7. Классы, помеченные как final

    После объявления класса final он не может быть унаследован. Следующий пример вызовет ошибку:

    <?php
    final
    class FinalClass {
    }

    class
    BogusClass extends FinalClass {
    }
    ?>

  8. Явное клонирование объекта

    Чтобы явно клонировать объект, вы должны использовать ключевое слово clone. Вы можете объявить метод __clone(), который будет вызван при клонировании объекта (после того, как все свойства будут скопированы из исходного объекта).

    <?php
    class MyClass {
        function
    __clone() {
            print
    "Object is being cloned";
        }
    }
    $obj = new MyClass();
    clone $obj;
    ?>

  9. Константы класса

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

    <?php
    class MyClass {
        const
    SUCCESS = "Success";
        const
    FAILURE = "Failure";
    }
    print
    MyClass::SUCCESS;
    ?>

  10. Статические члены класса

    Определения классов могут теперь включить статических членов класса (свойства и методы), доступ к которым осуществляется через класс. Общее использование статических членов показано на примере:

    <?php
    class Singleton {
        static
    private $instance = NULL;

        
    private function __construct() {
        }

        static
    public function getInstance() {
            if (
    self::$instance == NULL) {
                
    self::$instance = new Singleton();
            }
            return
    self::$instance;
        }
    }
    ?>

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

    Вы можете теперь определить методы как статические, разрешая им быть вызванными вне контекста объекта. Статические методы не определяются через переменную $this, поскольку они не должны быть ограничены определенным объектом.

    <?php
    class MyClass {
        static function
    helloWorld() {
            print
    "Hello, world";
        }
    }
    MyClass::helloWorld();
    ?>

  12. Абстрактные классы

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

    <?php
    abstract
    class MyBaseClass {
        function
    display() {
            print
    "Default display routine being called";
        }
    }
    ?>

  13. Абстрактные методы

    Метод может быть объявлен как abstract, таким образом отложив его определение наследуемым классом. Класс, который включает абстрактные методы, должен быть объявлен как abstract.

    <?php
    abstract
    class MyBaseClass {
        
    abstract function display();
    }
    ?>

  14. Указание класса как типа

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

    <?php
    function expectsMyClass(MyClass $obj) {

    }
    ?>

  15. Поддержка разыменования объектов, которые возвращаются методами.

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

    Поясним на примере. В PHP 4:

    <?php
    $dummy
    = $obj->method();
    $dummy->method2();
    ?>

    В PHP 5:

    <?php
    $obj
    ->method()->method2();
    ?>

  16. Итераторы

    PHP 5 позволяет последовательно получать доступ к элементам класса через конструкцию foreach().

    <?php
    $obj
    = new MyIteratorImplementation();
    foreach (
    $obj as $value) {
        print
    "$value";
    }
    ?>

  17. __autoload()

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

    В PHP 5 в этом больше нет необходимости. Вы можете определить функцию __autoload() , которая автоматически будет вызываться в случае использования класса, который не был определен выше. Вызывая такую функцию, Zend Engine дает возможность загрузить файл с определением класса прежде, чем будет сформировано сообщение об ошибке и выполнение скрипта прекратится.

    <?php
    function __autoload($class_name) {
        include_once(
    $class_name . "php");
    }

    $obj  = new MyClass1();
    $obj2 = new MyClass2();
    ?>