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

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

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

Друзья сайта

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

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

PHP5 - Новые возможности PHP5-Zend Engine 2_0 1
[1 страница]

Введение


Этот документ - достаточно вольный перевод статьи с официального сайта PHP - http://php.net/. Если у вас нет проблем с английским языком, рекомендую ознакомиться с первоисточником.
Новая объектная модель

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

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

Частные и защищенные элементы класса


В PHP5 введены частные (private) и защищенные (protected) переменные-элементы класса (member variables), что позволяет определять область их видимости.

Пример:

Защищенные (protected) переменные-элементы класса доступны методам (methods) класса, в котором они объявлены, и методам производного от него класса. Частные (private) элементы класса доступны только методам класса, в котором они объявлены.


<?php
class MyClass {
   
private $Hello = "Hello, World!n";
   
protected $Bar = "Hello, Foo!n";
   
protected $Foo = "Hello, Bar!n";

    function
printHello() {
        print
"MyClass::printHello() " . $this->Hello;
        print
"MyClass::printHello() " . $this->Bar;
        print
"MyClass::printHello() " . $this->Foo;
    }
}

class
MyClass2 extends MyClass {
   
protected $Foo;

    function
printHello() {
       
MyClass::printHello(); /* Выведет значение */
       
print "MyClass2::printHello() " . $this->Hello; /* Ничего не выведет */
       
print "MyClass2::printHello() " . $this->Bar; /* Не выведет значение (переменная не определена)*/
       
print "MyClass2::printHello() " . $this->Foo; /* Выведет значение */
   
}
}

$obj = new MyClass(); print $obj->Hello; /* Ничего не выведет */
print $obj->Bar; /* Ничего не выведет */
print $obj->Foo; /* Ничего не выведет */
$obj->printHello(); /* Выведет значение */

$obj = new MyClass2();
print
$obj->Hello; /* Ничего не выведет */
print $obj->Bar; /* Ничего не выведет */
print $obj->Foo; /* Ничего не выведет */
$obj->printHello();
?>


Частные и защищенные методы


В PHP5 также введены частные (private) и защищенные (protected) методы.

Пример:


<?php
class Foo {
   
private function aPrivateMethod() {
    echo
"Вызван метод Foo::aPrivateMethod().n";
    }

   
protected function aProtectedMethod() {
        echo
"Вызван метод Foo::aProtectedMethod().n";
   
$this->aPrivateMethod();
    }
}

class
Bar extends Foo {
   
public function aPublicMethod() {
        echo
"Вызван метод Bar::aPublicMethod().n";
   
$this->aProtectedMethod();
    }
}

$o = new Bar;
$o->aPublicMethod();
?>


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

Абстрактные классы и методы


В PHP5 также введены абстрактные (abstract) классы и методы. Абстрактный метод представляет собой только объявление метода и не предусматривает его реализации. Класс, содержащий абстрактные методы, должен быть объявлен абстрактным.

Пример:


<?php
abstract
class AbstractClass {
   
abstract public function test();
}

class
ImplementedClass extends AbstractClass {
   
public function test() {
    echo
"Вызван метод ImplementedClass::test().n";
    }
}

$o = new ImplementedClass;
$o->test();
?>


Создание экземпляра абстрактного класса невозможно.

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

Интерфейсы


В PHP5 введены интерфейсы (interfaces). Класс может реализовывать произвольное число интерфейсов.

Пример:


<?php
interface Throwable
{
   
public function getMessage();
}

class
Exception implements Throwable {
   
public function getMessage() {
       
// ...
   
}
}
?>


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

Уточнение типа класса (Class Type Hints)


Оставаясь слабо типизированным языком, PHP5 предоставляет возможность использовать уточнения типа класса (class type hints) для указания ожидаемого класса объекта, передаваемого методу в качестве параметра.

Пример:


<?php
interface Foo
{
    function
a(Foo $foo);
}

interface Bar {
    function
b(Bar $bar);
}

class
FooBar implements Foo, Bar {
    function
a(Foo $foo) {
   
// ...
   
}

    function
b(Bar $bar) {
       
// ...
   
}
}

$a = new FooBar;
$b = new FooBar;

$a->a($b);
$a->b($b);
?>


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


<?php
function foo(ClassName $object) {
   
// ...
}
?>

<?php
function foo($object) {
    if (!(
$object instanceof ClassName)) {
        die(
"Argument 1 must be an instance of ClassName");
    }
}
?>


Данный синтаксис применим только к объектам/классам, но не к встроенным типам данных.

Ключевое слово final


В PHP5 введено ключевое слово "final", используемое для определения финальных элементов и методов класса. Элементы и методы, в объявлении которых указано ключевое слово "final", нельзя переопределить в классе-потомке.

Пример:


<?php
class Foo {
   
final function bar() {
       
// ...
   
}
}
?>


Также возможно использовать ключевое слово "final" в определении самого класса, что запретит создание производных от него классов. При этом все элементы и методы такого класса автоматически являются финальными, и определять их таковыми явно нет необходимости.

Пример:


<?php
final
class Foo {
   
// определение класса
}

// следующая строка вызовет ошибку времени выполнения
// class Bork extends Foo {}
?>


Свойства не могут быть финальными.

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

[fixxxer] Примечание: в PHP все методы класса являются виртуальными.
Категория: php | Добавил: freeone (03.06.2007)
Просмотров: 535 | Рейтинг: 0.0 |

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

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