Что нового в PHP 5.3 Дмитрий Стогов

Содержание

Слайд 2

Немного о себе

сотрудник Zend Technologies
отдел Advanced Technologies
активный разработчик PHP и ZE
автор и

Немного о себе сотрудник Zend Technologies отдел Advanced Technologies активный разработчик PHP
мантейнер ext/soap
мантейнер поддержки FastCGI в PHP
автор компоненты OpenID в Zend Frameork
автор Turck MMCache

Слайд 3

Почему PHP 5.3?

PHP 5.2 существует уже 1.5 года. В нем найдено несколько

Почему PHP 5.3? PHP 5.2 существует уже 1.5 года. В нем найдено
серьезных ошибок, которые не могут быть исправлены без потери бинарной совместимости.
В PHP 6, из-за перехода на Unicode, перестанет работать большое количество наработанного кода.
Для PHP 6 было разработано много интересных дополнений и улучшений.
PHP 5.3 будет содержать большинство улучшений разработанных для PHP 6, но будет способен выполнять существующий код без каких-либо изменений.

Слайд 4

Что нового?

Нововведения в языке
Расширение системы конфигурирования
Сборщик мусора
Улучшеная производительность
Исправленные ошибки
Новые расширения ext/phar и

Что нового? Нововведения в языке Расширение системы конфигурирования Сборщик мусора Улучшеная производительность
ext/intl
Множество улучшений в расширениях

Слайд 5

Нововведения в языке

namespaces
Расширения ООП
Late Static Binding
Динамический доступ к статическим данным $classname::method(), $classname::$prop

Нововведения в языке namespaces Расширения ООП Late Static Binding Динамический доступ к

__callstatic()
Оператор goto
Сокращенный условный оператор ?:
NOWDOC <<<‘EOF’ EOF;
Константа __DIR__

Слайд 6

Зачем нужны namespace-ы?

Устраняют конфликты имен
Разные namespace-ы могут использовать одно и то же

Зачем нужны namespace-ы? Устраняют конфликты имен Разные namespace-ы могут использовать одно и
имя для разных целей
Имя внутри namespace-а имеет единственный смысл
Namespace-ы делают имена короче
Имена определенные в namespace-ах имеют короткое (локальное) имя и уникальное длинное (квалифицированное) для использования за пределами namespace-а
Имена и namespace-ы могут быть импортированы в другие namespace-ы используя короткое “имя импорта”

Слайд 7

namesapce-ы

Один namespace может определяться в нескольких файлах
В namespace-е могут определяться
классы
интерфейсы
функции
константы
PHP код
В namespace-е

namesapce-ы Один namespace может определяться в нескольких файлах В namespace-е могут определяться
не могут определяться
Глобальные переменные
PHP не поддерживает вложенных namespace-ов
PHP поддерживает составные имена namespace-ов (A::B)
Почти вся работа делается во время компиляции

Слайд 8

namespace-ы
define(“MY_HTTP_GET”, 1);
define(“MY_HTTP_POST”, 2);
class My_Http_Request {
function __construct(
$method = ZEND_HTTP_GET)
{
}
}
function my_http_send_request(
My_Http_Request $request) {
}

namespace My::Http;
const

namespace-ы define(“MY_HTTP_GET”, 1); define(“MY_HTTP_POST”, 2); class My_Http_Request { function __construct( $method =
GET = 1;
const PUT = 2;
class Request {
function __construct(
$method = GET)
{
}
}
function send_request(
Request $request) {
}

Слайд 9

namespace в нескольких файлах

My/Http/Request.php
namespace My::Http;
class Request {
}
My/Http/Response.php
namespace My::Http;
class Response {
}

My/Http/Main.php
namespace My::Http;
function send(Request

namespace в нескольких файлах My/Http/Request.php namespace My::Http; class Request { } My/Http/Response.php
$req) {
return new Response();
}

Слайд 10

Длинные имена

test1.php
require_once(“My/Http/Request.php”);
$x = new My::Http::Request();

Длинные имена test1.php require_once(“My/Http/Request.php”); $x = new My::Http::Request();

Слайд 11

Импорт – оператор “use”

Импорт может быть осуществлен посредством оператора “use”
use My::Http;
Оператор “use”

Импорт – оператор “use” Импорт может быть осуществлен посредством оператора “use” use
может импортировать
Namesapce-ы
классы
интерфейсы
Он не может импортировать
функции
константы
переменные
В момент импорта можно сделать переименование
use My::Http::Request as HttpRequest;
use My::Http::Request; // the same as use My::Http::Reques as Request;
Оператор “use” действует только на текущий файл
Оператор “use” сам не подгружает ни каких файлов

Слайд 12

Импорт класса

test3.php
require_once(“My/Http/Request.php”);
use My::Http::Request;
$x = new Request();

Импорт класса test3.php require_once(“My/Http/Request.php”); use My::Http::Request; $x = new Request();

Слайд 13

Импорт целого namespace-а

test4.php
require_once(“My/Http/Request.php”);
use My::Http;
$x = new Http::Request();
test5.php
require_once(“My/Http/Request.php”);
use My::Http as H;
$x = new

Импорт целого namespace-а test4.php require_once(“My/Http/Request.php”); use My::Http; $x = new Http::Request(); test5.php
H::Request();

Слайд 14

Внутренние имена

namespace A::B;
function foo() {
echo __FUNCTION__; // A::B::foo
}
class C {
static function bar() {
echo

Внутренние имена namespace A::B; function foo() { echo __FUNCTION__; // A::B::foo }
__CLASS__; // A::B::C
echo __FUNCTION__; // bar
echo __METHOD__; // A::B::C::bar
}
}

Слайд 15

Константа __NAMESPACE__

namesapce A::B;
function foo() {
echo __NAMESAPCE__;
}
$callback = “foo”;
$callback(); // global function foo()
$callback =

Константа __NAMESPACE__ namesapce A::B; function foo() { echo __NAMESAPCE__; } $callback =
“A::B::foo”;
$callback(); // A::B::foo()
$callback = __NAMESAPCE__ . “::foo”;
$callback(); // A::B::foo()

Слайд 16

namesapce-ы и __autoload

use My::Http::Request;
function __autoload($name) {
require_once(
str_replace(“::”, “/”, $name) . “.php”);
}
$x =

namesapce-ы и __autoload use My::Http::Request; function __autoload($name) { require_once( str_replace(“::”, “/”, $name)
new Request(); // loads “My/Http/Request.php”

Слайд 17

Неоднозначности в namespace-ах

Разрешение коротких имен:
Имена импорта
use A::B::Foo;
use A::B::Bar as Baz;
$x = new

Неоднозначности в namespace-ах Разрешение коротких имен: Имена импорта use A::B::Foo; use A::B::Bar
Foo; // A::B::Foo
$x = new Baz; // A::B::Bar
Имена из текущего namespace-а
namespace A::B;
class stdClass {
}
$x = new stdClass(); // A::B::stdClass
Внутренние имена PHP
namespace A::B;
$x = new stdClass; // internal stdClass

Слайд 18

Неоднозначности в namespace-ах

Явное разрешение специальными префиксами
namespace A::B;
class stdClass {
}
$x = new stdClass(); //

Неоднозначности в namespace-ах Явное разрешение специальными префиксами namespace A::B; class stdClass {
A::B::stdClass
$x = new ::stdClass(); // global stdClass
$x = new namespace::stdClass(); // A::B::stdClass

Слайд 19

Неоднозначности в namespace-ах

Разрешение длинных имен классов:
Имена импорта
use A::B::C;
new C::D; // class D

Неоднозначности в namespace-ах Разрешение длинных имен классов: Имена импорта use A::B::C; new
in namespace A::B::C
2. Класс из другого namespace-a (как есть)
namespace A::B;
new C::D; // class D in namespace C (not A::B::C::D)
Имена функций и констант:
Функция или константа из текущего namespace-a A::foo(); // function foo() in namespace A
Статический метод или константа класса A::foo() // static method foo() of class A // A is resolved according to class resolution rules

Слайд 20

Late Static Binding

class Singleton {
const ID = 0;
static $instance = array();
static function

Late Static Binding class Singleton { const ID = 0; static $instance
getInstance() {
$id = static::ID;
if (empty(self::$instance[$id])) {
self::$instance[$id] = new static;
}
return self::$instance[$id];
}
}
class Foo extends Singleton {
const ID = 1;
}
$x = Foo::getInstance();

Слайд 21

Динамический доступ к статическим данным класса

class MySqlDriver {
const NAME = “MySQL”;
static function

Динамический доступ к статическим данным класса class MySqlDriver { const NAME =
execute($sql) {
}
}
$db = “MySqlDriver”;
echo $db::NAME;
$db::execute(“SELCT * FROM foo;”);

Слайд 22

__callstatic()

class DummyDriver {
const NAME = ‘Dummy’;
static function __callstatic($name, $args) {
echo static::NAME.“::$name

__callstatic() class DummyDriver { const NAME = ‘Dummy’; static function __callstatic($name, $args)
is not implemented”;
}
}
class MySqlDriver extends DummyDriver {
const NAME = ‘MySQL’;
}
$db = ‘MySqlDriver’;
$db::execute(‘SELCT * FROM foo;’);

Слайд 23

Оператор GOTO

Реализован для поддержки программно-генерируемого кода
“GOTO” внутрь цикла или оператора switch запрещен
RETRY:
try

Оператор GOTO Реализован для поддержки программно-генерируемого кода “GOTO” внутрь цикла или оператора
{

} catch (Excption $e) {
recovery($e);
goto RETRY;
}

Слайд 24

Оператор ?:

$a ?: $b === $a ? $a : $b

Оператор ?: $a ?: $b === $a ? $a : $b

Слайд 25

NOWDOC

Аналог строк в одиночных кавычках
$a = 3;
$b = 5;
echo <<$a+$b
EOF; // prints

NOWDOC Аналог строк в одиночных кавычках $a = 3; $b = 5;
3+5
echo <<<‘EOF’
$a+$b
EOF; // prints $a+$b
echo <<<“EOF”
$a+$b
EOF; // printd 3+5

Слайд 26

Константа __DIR__

__DIR__ === dirname(__FILE__)
class Foo {
const BAR = dirname(__FILE__); // error
const BAR

Константа __DIR__ __DIR__ === dirname(__FILE__) class Foo { const BAR = dirname(__FILE__);
= __DIR__;
public $bar = dirname(__FILE__); // error
public $bar = __DIR__;
}

Слайд 27

INI System

Разные уствновки для разных директорий [PATH=/www/test] error_repoting = E_ALL [PATH=/www/production] error_reporting = 0
Разные установки для

INI System Разные уствновки для разных директорий [PATH=/www/test] error_repoting = E_ALL [PATH=/www/production]
разных виртуальных хостов [HOST=www.domain.com] auto_prepend_file = “/var/www/domain/init.php”
Собственный аналог .htaccess
user_ini.filename = “.user.ini”
user_ini.cache_ttl = 300

Слайд 28

Сборщик мусора

Уничтожает циклические структуры
$a = array();
$a[0] =& $a; // refcount is 2
unset($a);
echo

Сборщик мусора Уничтожает циклические структуры $a = array(); $a[0] =& $a; //
gc_collect_cycles(); // 1 – number of
// collected variables
gc_disable();
gc_enable();

Слайд 29

Улучшение производительности

$ php bench.php

Улучшение производительности $ php bench.php
Имя файла: Что-нового-в-PHP-5.3-Дмитрий-Стогов.pptx
Количество просмотров: 605
Количество скачиваний: 1