Главная | Статьи | Регистрация | Вход | RSS
Меню сайта
Смотрю Mac блог!
Категории каталога
PHP [6]
статьи по установки скриптов, описание функций и т.д.
PHP5 [5]
статьи по php5, новые возможности и функции
Хостинг (Hosting) [4]
описания работы с хостингом
Свой сервер [2]
описание как создать и запустить свой сервер с Apache, PHP, MySQL
Средства разработки [3]
утилиты и помощники при разработки веб-приложения
Рекламные статьи [1]
ссылки:
Друзья сайта
Статистика
PHP5
Главная » Статьи » PHP5

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

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

В PHP5 объектная модель была значительно переработана. При этом было добавлено много новых возможностей, благодаря которым PHP5 получил некоторые черты таких объектно-ориентированных языков, как C++ и Java. В этой статье описывается новая объектная модель PHP5, и приводятся примеры использования новых возможностей.

Конструкторы и деструкторы

В PHP4 конструктор необходимо было называть, так же как и сам класс. В PHP5 конструктор класса имеет имя __construct(), а деструктор – __destruct(). Если в классе есть и __construct() и функция, имя которой совпадает с именем класса, то в качестве конструктора будет вызван __construct(). При перегрузке метода-конструтора вызов конструктора класса-предка осуществляется через parent::__construct().

Если конструктор объявлен с модификатором private, то класс с таким конструктором создать невозможно. Но при этом возможно обращение parent::__construct(). Подобный прием дает еще один способ избежать создания класса, помимо объявления его как абстрактный.

Деструкторы являются нововведением PHP5. Они очень полезны для выполнения различных действий по освобождению ресурсов, таких как закрытие открытых файлов или соединения с базой данных. Для деструкторов в PHP5 зарезервировано имя __destruct().

Как и для конструкторов, если деструктор унаследован и не перегружен, он вызовется. Если он перегружен, то вызовется только перегруженный конструктор. Для вызова деструктора объекта-предка надо использовать parent::__destruct(). Деструктор вызывается без параметров.

Код:
<?
class MyClass
{
    function __construct()
    {
        echo "Object constructed<br>\n";
    }

    function __destruct()
    {
        echo "Object destructed<br>\n";
    }
}

$Object = new MyClass();
?>

Вывод:
Object constructed
Object destructed

Передача объектов по ссылке

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

Код:
<?
class MyClass
{
    var $Property;

    function Set($Property)
    {
        $this->$Property = $Property;
    }

    function Get()
    {
        return $this->Property;
    }
}

$Object1 = new MyClass;
$Object1->Set(4);
$Object2 = $Object1;
$Object1->Set(5);

if ($Object1->Get() == $Object2->Get())
{
    echo "Properties are equal<br>\n";
}
?>

Вывод:
Properties are equal

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

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

Код:
<?
class MyClass
{
    var $Property;

    function Set($Property)
    {
        $this->Property = $Property;
    }

    function Get()
    {
        return $this->Property;
    }
}

$Object1 = new MyClass;
$Object1->Set(4);
$Object2 = clone $Object1;
$Object1->Set(5);

if ($Object1->Get() != $Object2->Get())
{
    echo "Copies are independents<br>\n";
}
?>

Вывод:
Copies are independents

Ограничение доступа к атрибутам и методам

В PHP5 добавлены новые модификаторы уровня доступа для переменных и методов классов. Как и в таких объектно-ориентированных языках как C++ и Java, они называются private, protected и public.

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

Код:
<?
class BaseClass
{
    var $Property;

    public function PublicMethod()
    {
        print("Public method<br>\n");
    }

    protected function ProtectedMethod()
    {
        $this->PrivateMethod(); // Ok

        print("Protected method<br>\n");
    }

    private function PrivateMethod()
    {
        $this->Property = 5;

        print("Private method<br>\n");
    }
}

class ExtClass extends BaseClass
{
    public function Display()
    {
        $this->ProtectedMethod();
        $this->PublicMethod();
        //$this->PrivateMethod(); // Invalid
    }
}

$Object1 = new BaseClass();
$Object1->PublicMethod();
//$Object1->ProtectedMethod(); // Invalid
//$Object1->PrivateMethod(); // Invalid

$Object2 = new ExtClass();
$Object2->Display();
?>

Вывод:
Public method
Private method
Protected method
Public method

Константы в классах

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

Код:
<?
class MyClass
{
    const Property = 5;
}

echo "Constant member: " . MyClass::Property;
?>

Вывод:
Constant member: 5

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

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

Код:
<?
class MyClass
{
    static function Display()
    {
        echo "Static function of class<br>\n";
    }
}

MyClass::Display();
?>

Вывод:
Static function of class

Код:
<?
class MyClass
{
    static public $Property = 5;
}

echo "Static member: " . MyClass::$Property;
?>

Вывод:
Static member: 5

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

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

Если метод определяется как abstract, он должен быть переопределен в классе-потомке. При этом параметры переопределенного метода должны совпадать с параметрами абстрактного метода. Модификатор уровня доступа для абстрактных методов не учитывается. Уровень доступа определяется методом, переопределяющим абстрактный.

Код:
<?
abstract class BaseClass
{
    abstract function Display();
}

class ExtClass extends BaseClass
{
    function Display()
    {
        echo "Function Display in extended class<br>\n";
    }
}

$Object = new ExtClass;
$Object->Display();
?>

Вывод:
Function Display in extended class

Интерфейсы

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

Код:
<?
interface Displayable
{
    function Display();
}

interface Storeable
{
    function Store();
}

class Figure implements Displayable, Storeable
{
    function Display()
    {
        echo "Display function<br>\n";
    }

    function Store()
    {
        echo "Store function<br>\n";
    }
}

$Object = new Figure;
$Object->Display();
$Object->Store();
?>

Вывод:
Display function
Store function

Финальные классы и методы

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

Код:
<?
class FinalClass
{
    final function Display()
    {
        echo "Final function<br>\n";
    }
}
?>

Код:
<?
final class FinalClass
{
}

class ExtendClass extends FinalClass // Invalid
{
}
?>



Источник: http://dak.mmforce.net/message.php?mid=1520
Категория: PHP5 | Добавил: php (12.12.2007)
Просмотров: 6036
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

  • Денвер (Denwer)
  • PHP Compiler
  • Что такое Хостинг?
  • Что такое Сервер?
  • Установка Форума ExBB ( без MySQL )
  • Новые возможности языка
  • Новые возможности языка (2я часть)
  • Новые возможности языка (3я часть)
  • Macromedia Dreamweaver 4
  • Ошибки PHP программиста
  • Уроки и статьи по PHP, PHP5. Скрипты для сайта, скрипты форумов, новостные, cms. Инфо: . Скрипты для скачивания.
    Copyright VLP © 2020