Отличия (различия) PHP4 и PHP5

Особенности языка

  • PHP5 поддерживает ограниченное количество указателей типа. Это позволяет вам указать определенный тип данных для параметра функции или метода класса (или один из подтипов), или массив. Однако, вы не можете определить другие скалярные типы.
  • Конструкция foreach теперь поддерживает объявление значения элемента по ссылке.
  • К ядру платформы был добавлен ряд новых функций для работы со строками и массивами.


Объекты

  • Для всех намерений и целей, все объекты в PHP5 передаются по ссылке. Это
    означает, что назначение объекта переменной не будет приводить к созданию его копии,
    а предполагает создание еще одной ссылки на него.
  • Константы, также как статические методы и свойства, могут быть определены в рамках класса.
  • Методы и свойства класса теперь имеют функции видимости (модификаторы ограничения доступа), и могут быть объявлены как
    public, private или protected. Классы и методы могут также быть объявлены как final, для предотвращения их переопределения в производных классах.
  • Так как все объекты присваиваются по ссылке, необходим специализированный механизм
    для копирования объектов. Для этого можно использовать ключевое слово clone и специальный («магический») метод __clone().
  • В PHP5 добавлены унифицированные функции конструктора (__construct()) и деструктора (__destruct()) объектов, при этом деструктор является новым для PHP методом, предназначенным для уничтожения объектов.
  • C добавленными интерфейсами и абстрактными классами, PHP-разработчики теперь могут иметь больший контроль над применением ООП.
    Интерфейсы могут использоваться для определения общих API, в то время как абстрактные классы описывают модели для реализаций класса, которые следуют определенному плану (проекту).
  • Определения классов теперь могут быть загружены по требованию с помощью функции __autoload().

Магические методы

В PHP5 было введено множество новых «магических» методов:

  • __get() и __set() методы вызываются при доступе к свойству неопределенного объекта или присвоении ему значения, в то время как __call() выполняется при вызове несуществующего метода класса.
  • __isset() метод срабатывает при вызове функций isset() на несуществующем или недоступном свойстве класса.
  • __unset() метод срабатывает при вызове функции unset() с неопределенным свойством класса в качестве аргумента.
  • __toString() метод срабатывает при попытке использованию напрямую конструкции echo или функции print() для объекта.
  • __set_state() метод срабатывает динамически для тех классов, которые экспортируются функцией var_export().

Некоторые новые расширения

  • SimpleXML обеспечивает легкий доступ к XML данным используя объектную и нотацию массивов.
  • PHP5 также представляет DOMXML, DOMXSL и Sablotron замена в форме основанного на libxml2 DOM и XSL расширения.
  • PHP Data Objects (PDO) расширение обеспечивает объединенное расширение доступа к базам данных которое позволяет производить доступ к различным типам систем баз данных при использовании общего интерфейса и методов. PDO не использует абстрактных слоёв для подключения к БД, наподобие ODBC, а использует для разных БД их «родные» драйверы, что позволяет добиться высокой производительности.
  • Hash-расширение является заменой GPLed libmhash; оно было добавлено в ядро PHP с версии 5.1.2. Она позволяет производить hash используя много алгоритмов, включая как знакомые MD5 и SHA1, так и более безопасные (хотя более медленные), например, snefru.
  • Стандартная PHP библиотека (SPL) обеспечивает многочисленные интерфейсы, которые увеличивают пути взаимодействия классов с языком PHP, включая новые интерфейсы Iterator.
  • Новое расширение Reflection позволяет производить самоанализ во время выполнения кода PHP.

Управление обработкой ошибок

  • Классы теперь поддерживают исключения; функция set_exception_handler() позволяет определить обработчик исключений для всего срипта.
  • Был добавлен новый уровень сообщений об ошибках — E_STRICT, для генерации предупреждений о устаревших методах программирования в коде.

Подробнее:

Новые возможности языка

Новая объектно-ориентированная модель

Когда Зив Сераски (Zeev Suraski) добавил объектно-ориентированный (ОО) синтаксис в PHP 3, это можно было рассматривать как "синтаксический подсластитель для поддержки классов" ("syntactic sugar for accessing collections"). Объектно-ориентированная модель получила поддержку наследования и позволяла классу (и объекту) объединять методы и свойства, но не более того. Когда Зив и Анди переписали движок для PHP 4, это был полностью новый движок, работающий много быстрее, намного стабильнее и с еще многими другими возможностями. Однако, изменения практически не затронули ОО модель, первоначально введенную еще в РНР 3.

Хотя объектная модель имела серьезные ограничения, она широко использовалась, часто в очень больших приложениях, написанных на PHP. Это победное шествование парадигмы ООП, даже такой ограниченной в РНР 4, привело к тому, что изменения объектной модели стали центральными в новом релизе РНР.

Какие были ограничения в PHP 3 и 4? Самым большим ограничением (которое и приводило ко всем остальным ограничениям) был тот факт, что семантика экземпляра объекта была такой же, что и для родных типов. Как это фактически отражалось на разработчиках? Когда вы присваивали переменную (которая указывает на объект) другой переменной, то создавалась копия объекта. Мало того, что это влияло на производительность, но и это обычно приводило к ошибкам в приложении, потому что многие разработчики думали, что обе переменные будут указывать на тот же самый объект. А они указывали на разные копии того же самого объекта, поэтому, изменяя один объект, мы не меняли другой.

Например:

<?php
class Person {
    var
$name;
    function
getName() {
        return
$this->name;
    }
    function
setName($name) {
        
$this->name = $name;
    }
    function
Person($name) {
        
$this->setName($name);
    }
}

function
changeName($person, $name) {
    
$person->setName($name);
}

$person = new Person("Andi");
changeName($person, "Stig");
print
$person->getName();
?>

В РНР 4 этот код выведет "Andi". Причина кроется в том, что мы передаем объект $person в функцию changeName() по значению, а не по ссылке, таким образом, объект $person будет скопирован, и changeName() будет работать уже с копией объекта $person.

Такое поведение не является интуитивно понятным. Действительно, многие разработчики ожидали Java-подобного поведения. В Java, переменные фактически являются указателями на объект, и поэтому при дублировании будет скопирован указатель, а не сам объект.

Было два вида разработчиков: те, кто знал об этой проблеме, и те, кто не знал. Последние, обычно, не сталкивались с этой проблемой, потому что их код был написан так, что было безразлично, существует ли такая проблема или нет. Конечно, некоторые из этих разработчиков проводили бессонные ночи в "увлекательных" поисках "сверхъестественных" ошибок. Первая группа также имела проблему, поскольку приходилось вручную определять передачу объекта по ссылке, запрещая движку копировать объекты, и код был испещрен многочисленными знаками '&'.

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

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

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

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

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

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

  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();
    ?>

Другие новые возможности языка

  1. Обработка исключений

    PHP 5 добавляет парадигму обработки исключений, вводя структуру try/throw/catch. Вам остается только создать объекты, которые наследуют класс исключений Exception.

    <?php
    class SQLException extends Exception {
        
    public $problem;
        function
    __construct($problem) {
            
    $this->problem = $problem;
        }
    }

    try {
        ...
        
    throw new SQLException("Couldn't connect to database");
        ...
    }
    catch (SQLException $e) {
        print
    "Caught an SQLException with problem $obj->problem";
    }
    catch (Exception $e) {
        print
    "Caught unrecognized exception";
    }
    ?>

    В настоящее время в целях обратной совместимости большинство внутренних функций не использует исключения. Однако, все новые расширения будут иметь такую возможность, и вы можете использовать такую конструкцию в своем исходном тексте. Кроме того, подобно уже существующей функции set_error_handler(), вы можете использовать set_exception_handler(), чтобы отловить необработанное исключение прежде, чем выполнение скрипта будет закончено.

  2. foreach с сылкой

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

    <?php
    foreach ($array as &$value) {
        if (
    $value === "NULL") {
            
    $value = NULL;
        }
    }
    ?>

  3. Значения по умолчанию для параметров, передаваемых по ссылке

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

    <?php
    function my_func(&$arg = null) {
        if (
    $arg === NULL) {
            print
    '$arg is empty';
        }
    }
    my_func();

    ?>

Основные изменения в РНР

XML и Web Services

После изменений, касающихся самого языка, изменения в работе с XML в PHP 5 являются, вероятно, самыми существенными и захватывающими. Расширение функциональных возможностей XML в PHP 5 делают язык полностью равноправным другим, используемыми в сети.

Основы

Поддержка XML в PHP 4 базировалась на разнообразных библиотеках XML. Поддержка SAX осуществлялась старой библиотекой Expat, для использования XSLT необходима была библиотека Sablotron, для DOM использовалась более мощная libxml2 - библиотека проекта GNOME.

Использование разнообразных сторонних библиотек не делало PHP 4 лучше других языков, когда дело касалось поддержки XML. Сопровождение библиотек расширений было слабое, новые стандарты XML не всегда поддерживались, производительность была не столь хороша, как была возможна, взаимодействия между различными расширениями XML не существовало.

В PHP 5 все расширения XML были переписаны, чтобы использовать отличный набор инструментов, предоставляемый libxml2 (http://www.xmlsoft.org/). Это библиотека богатая возможностями, отлично сопровождаемая и эффективно реализовавшая стандарты XML, предоставляющая передовые возможности технологии XML в PHP.

Все вышеупомянутые расширения (SAX, DOM и XSLT) теперь используют libxml2, включая новые дополнительные расширения - SimpleXML и SOAP.

SAX

Как говорилось выше, новая реализация SAX переведена от использования Expat к libxml2. Хотя новое расширение должно быть совместимо, могут быть некоторые тонкие различия. Разработчики, которые хотят продолжать работать с библиотекой Expat, могут это сделать, конфигурируя и собирая PHP соответствующим образом (не рекомендовано).

DOM

Хотя поддержка DOM в PHP 4 была также основана на библиотеке libxml2, она изобиловала ошибками, грешила утечками памяти, и API во многих случаях не соответствовал рекомендациям W3C. Расширение DOM было полностью переписано для PHP 5. Мало того, что расширение было коренным образом переписано, теперь оно соответствует рекомендациям W3C. Например, названия функций теперь используют нотацию studlyCaps (присваивание имен со смешанным употреблением заглавных и строчных букв) как предписано по стандарту W3C, облегчая для вас применение прочитанного в документации W3C в PHP. Кроме того, расширение DOM теперь поддерживает три вида схем для валидации XML документов - DTD, XML Schema и RelaxNG.

В результате этих изменений код, написанный для PHP 4 с использованием DOM, не всегда будет выполняться в PHP 5. Однако, простая корректировка названий функций к новому стандарту в большинстве случаев решает проблему.

XSLT

В PHP 4, было два расширения, которые поддерживали XSL-преобразования. Первое использовало Sablotron, а второе - поддержку XSLT в расширении DOM. В PHP 5 новое расширение XSL было основано на использовании libxml2. Так, в PHP 5 XSL-преобразование не принимает таблицу стилей XSLT в качестве параметра, но зависит от расширения DOM, чтобы загрузить ее. Таблица стилей может кэшироваться в памяти, и может быть применена ко многим документам для существенной экономии времени выполнения.

SimpleXML

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

Рассмотрите следующий XML-документ:

<clients>
<
client>
    <
name>John Doe</name>
    <
account_number>87234838</account_number>
</
client>
<
client>
    <
name>Janet Smith</name>
    <
account_number>72384329</account_number>
</
client>
</
clients>

Следующий фрагмент кода печатает имя каждого клиента и номер его аккаунта:

<?php
$clients
= simplexml_load_file('clients.xml');
foreach (
$clients->client as $client) {
    print
"$client->name has account number $client->account_number ";
}
?>

Как видим, SimpleXML действительно прост.

А в случае, если есть необходимость сделать что-то, что невозможно выполнить в рамках SimpleXML, вы можете преобразовать свой объект SimpleXML в дерево DOM, вызвав функцию dom_import_simplexml(), выполнить необходимое, и вернуться назад к SimpleXML, используя simplexml_import_dom(). Благодаря тому, что оба расширения реализованы в одной библиотеке XML, переключения между ними теперь реальны.

SOAP

Официально поддержка SOAP в PHP 4 отсутствовала. Обычно, при необходимости использовать SOAP, приходилось использовать PEAR, но поскольку код был написан полностью на PHP, приложение не могло выполняться так же, как встроенное С-расширение. Другие доступные С-расширения так и не смогли достичь стабильной версии и широкого применения, и поэтому не были включены в PHP 5.

Поддержка SOAP в PHP 5 была полностью переписана как С-расширение и, хотя на текущий момент находится последней стадии в бета-тестирования, было решено включить в его стандартный дистрибутив, поскольку он практически полностью реализует стандарт SOAP.

Следующий код демонстрирует вызов функции SomeFunction(), определенной в WSDL-файле:

<?php
$client
= new SoapClient("some.wsdl");
$client->SomeFunction($a, $b, $c);
?>

Новое расширение MySQLi (усовершенствованная MySQL)

В PHP 5 для MySQL AB (http://www.mysql.com/) было написано новое расширение MySQL, которое позволяет вам полностью использовать преимущества новых функциональных возможностей в MySQL 4.1 и более новых версий. В противовес старому расширению MySQL новое дает вам возможность использовать оба интерфейса: функциональный и объектно-ориентированный. Так что теперь у вас есть выбор что предпочесть. Новые возможности, поддерживаемые этим расширением, включают контроль транзакций, поддержку репликаций, SSL и многое другое...

Расширение SQLite

Поддержка SQLite (http://www.sqlite.org/) изначально была введена в PHP 4.3.x. Это встроенная библиотека SQL, которая не требует SQL сервера и очень подходит для приложений, которые не требуют масштабируемых SQL-серверов, или если вы разворачиваете свое приложение у провайдера, который не предоставляет вам доступ к SQL-серверу. Вопреки названию, SQLite очень богата возможностями и поддерживает транзакции, вложенные выборки, представления (view) и большие DB-файлы. Здесь это упомянуто, как возможность PHP 5, потому что поддержка SQLite была введена довольно в поздних релизах PHP 4, и поскольку PHP 5 предоставляет новый объектно-ориентированный интерфейс и поддерживает итераторы.

Tidy расширение

PHP 5 включает поддержку очень полезной библиотеки Tidy (http://tidy.sf.net/). Она позволяет разработчикам PHP разбирать, диагностировать, чистить и восстанавливать документы HTML. Tidy расширение поддерживает как функциональный, так и объектно-ориентированный интерфейс, и ее API использует механизм исключений РНР 5.

Perl extension

Хотя и не включенное по умолчанию в РНР 5, расширение Perl позволяет вам вызывать Perl-скрипты, использовать объекты Perl и использовать другие функциональные возможности Perl прямо из кода PHP. Это новое расширение можно найти в репозитарии PECL http://pecl.php.net/package/perl.

Другие новшества в PHP 5

Новый менеджер памяти

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

Прекращена поддержка Windows 95

Запуск PHP на платформе Windows 95 более не поддерживается, потому что невозможна поддержка функциональных возможностей, которые использует PHP. Поскольку Microsoft официально прекратила поддерживать эту платформу более года назад, разработчики PHP решили, что это будет мудрое решение.

Выводы

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

Источники: wmdn.ru и webcorp.ru

Оцени публикацию:
  • 3,15
Оценили человек: 3

Похожие статьи:

Справочники и учебники:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2017 YaPro.Ru

Главная » Веб-мастеру » PHP »