SlideShare a Scribd company logo
Что нового в  PHP 5.3 Дмитрий Стогов
Немного о себе сотрудник  Zend Technologies отдел  Advanced Technologies активный разработчик  PHP  и  ZE автор и мантейнер  ext/soap мантейнер поддержки  FastCGI  в  PHP автор компоненты  OpenID  в  Zend Frameork автор  Turck MMCache
Почему  PHP 5.3? PHP 5.2  существует уже  1.5  года .  В нем найдено несколько серьезных ошибок, которые не могут быть исправлены без потери бинарной совместимости. В  PHP 6 , из-за перехода на  Unicode,  перестанет работать большое количество наработанного кода .  Для  PHP 6  было разработано много интересных дополнений и улучшений. PHP 5.3  будет содержать большинство улучшений разработанных для  PHP 6,  но будет способен выполнять существующий код без каких-либо изменений .
Что нового ? Нововведения в языке Расширение системы конфигурирования Сборщик мусора Улучшеная производительность Исправленные ошибки Новые расширения  ext/phar  и  ext/intl Множество улучшений в расширениях
Нововведения в языке namespaces Расширения ООП Late Static Binding Динамический доступ к статическим данным   $ classname :: method (),  $classname::$prop   __callstatic () Оператор   goto Сокращенный условный оператор   ?: NOWDOC  <<<‘EOF’ EOF; Константа   __DIR__
Зачем нужны  namespace- ы ? Устраняют конфликты имен Разные  namespace- ы могут использовать одно и то же имя для разных целей Имя внутри  namespace -а имеет единственный смысл Namespace- ы   делают имена короче Имена определенные в  namespace -ах   имеют короткое  ( локальное )  имя и уникальное длинное  ( квалифицированное )  для использования за пределами  namespace -а Имена и  namespace -ы   могут быть импортированы в другие  namespace -ы   используя короткое  “ имя импорта ”
namesapce -ы Один  namespace  может определяться в нескольких файлах В  namespace- е могут определяться классы интерфейсы функции константы PHP  код В  namespace- е не могут определяться Глобальные переменные PHP  не поддерживает вложенных  namespace- ов PHP  поддерживает составные имена  namespace- ов  (A::B) Почти вся работа делается во время компиляции
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  GET  =  1; const  PUT  =  2; class  Request { function  __construct ( $method  =  GET ) { } } function  send_request ( Request $request ) { }
namespace  в нескольких файлах My/Http/Request.php <?php namespace   My :: Http ; class  Request  { } My/Http/Response.php <?php namespace   My :: Http ; class  Response  { } My/Http/Main.php <?php namespace   My :: Http ; function   send ( Request $req)  { return new  Response (); }
Длинные имена test1.php <?php require_once( “My/Http/Request.php” ); $x  = new  My :: Http :: Request ();
Импорт  –  оператор  “use” Импорт может быть осуществлен посредством оператора  “ use ” use   My :: Http ; Оператор  “use”  может импортировать Namesapce -ы классы интерфейсы Он не может импортировать функции константы переменные В момент импорта можно сделать переименование use  My :: Http :: Request  as  HttpRequest ; use  My :: Http :: Request ; // the same as use My::Http::Reques as Request ; Оператор  “use”  действует только на текущий файл Оператор  “use”  сам не подгружает ни каких файлов
Импорт класса test3.php <?php require_once( “My/Http/Request.php” ); use   My :: Http :: Request ; $x  = new  Request ();
Импорт целого  namespace- а test4.php <?php require_once( “My/Http/Request.php” ); use   My :: Http ; $x  = new  Http :: Request (); test5.php <?php require_once( “My/Http/Request.php” ); use   My :: Http   as   H ; $x  = new  H :: Request ();
Внутренние имена namespace  A :: B ; function  foo () { echo  __FUNCTION__ ; // A::B::foo } class  C  { static function  bar () { echo  __CLASS__ ; // A::B::C echo  __FUNCTION__ ; // bar echo  __METHOD__ ; // A::B::C::bar } }
Константа  __NAMESPACE__ namesapce  A :: B ; function  foo () { echo  __NAMESAPCE__ ; } $callback  =  “foo” ; $callback (); // global function foo() $callback  =  “A::B::foo” ; $callback (); // A::B::foo() $callback  =  __NAMESAPCE__  .  “::foo” ; $callback (); // A::B::foo()
namesapce -ы   и  __autoload <?php use  My :: Http :: Request ; function  __autoload ( $name ) { require_once(  str_replace( “::” ,  “/” ,  $name ) .  “.php” ); } $x  = new  Request ();  // loads “My/Http/Request.php”
Неоднозначности в  namespace- ах Разрешение коротких имен : Имена импорта use  A :: B :: Foo ; use  A :: B :: Bar  as  Baz ; $x  = new  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
Неоднозначности в  namespace- ах Явное разрешение специальными префиксами namespace  A :: B ; class  stdClass  { } $x  = new  stdClass (); // A::B::stdClass $x  = new :: stdClass (); // global stdClass $x  = new namespace:: stdClass (); // A::B::stdClass
Неоднозначности в  namespace- ах Разрешение длинных имен классов : Имена импорта use  A :: B :: C ; new  C :: D ;  // class D 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
Late Static Binding class  Singleton  { const  ID  =  0 ; static  $instance  = array(); static function  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 ();
Динамический доступ к статическим данным класса class  MySqlDriver  { const  NAME  =  “MySQL” ; static function  execute($sql ) { } } $db  =  “MySqlDriver” ; echo  $db :: NAME ; $db :: execute ( “SELCT * FROM foo;” );
__callstatic() class  DummyDriver  { const  NAME  =  ‘Dummy’ ;  static function  __callstatic ( $name ,  $args ) { echo static:: NAME . “::$name is not implemented” ; } } class  MySqlDriver  extends  DummyDriver  { const  NAME  =  ‘MySQL’ ; } $db  =  ‘MySqlDriver’ ; $db :: execute ( ‘SELCT * FROM foo;’ );
Оператор  GOTO Реализован для поддержки программно-генерируемого кода “ GOTO”  внутрь цикла или оператора  switch  запрещен <?php RETRY : try { … } catch ( Excption   $e ) { recovery ( $e ); goto   RETRY ; }
Оператор  ?: $a  ?:  $ b   ===  $a  ?  $a  :  $b
NOWDOC Аналог строк в одиночных кавычках   <?php $a  =  3 ; $b  =  5 ; echo <<< EOF $a+$b EOF ; // prints 3+5 echo <<< ‘EOF’ $a+$b EOF ; // prints $a+$b echo <<< “EOF” $a+$b EOF ; // printd 3+5
Константа  __DIR__ __DIR__ === dirname(__FILE__) <?php class  Foo  { const  BAR  =  dirname ( __FILE__ );  // error const  BAR  =  __DIR__ ; public  $bar  =  dirname ( __FILE__ );  // error public  $bar  =  __DIR__ ; }
INI System Разные уствновки для разных директорий [PATH=/www/test] error_repoting  =  E_ALL [PATH=/www/production] error_reporting   =   0 Разные установки для разных виртуальных хостов [HOST=www.domain.com] auto_prepend_file   =   “/var/www/domain/init.php” Собственный аналог  .htaccess user_ini.filename   =   “.user.ini” user_ini.cache_ttl   =   300
Сборщик мусора Уничтожает циклические структуры <?php $a  =  array (); $a [0] =&  $a ; // refcount is 2  unset ( $a ); echo  gc_collect_cycles ();  // 1 – number of // collected variables gc_disable (); gc_enable ();
Улучшение производительности $ php bench.php
Вопросы ?

More Related Content

PPT
Юрий Гольцев - Сервис PLWWW
PPT
plwww (24.03) MEPHI (PHDays)
PDF
Приручаем linux-консоль
PPT
PHP Tricks
ODP
Программирование Linux
ODP
Программирование Linux
PPTX
PHP basic
PPTX
О безопасном использовании PHP wrappers
Юрий Гольцев - Сервис PLWWW
plwww (24.03) MEPHI (PHDays)
Приручаем linux-консоль
PHP Tricks
Программирование Linux
Программирование Linux
PHP basic
О безопасном использовании PHP wrappers

What's hot (20)

PPT
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
PDF
Perl: Symbol table
PDF
Язык программирования Go для Perl-программистов
PDF
Чуть сложнее чем Singleton: аннотации, IOC, АОП
PDF
Алексей Плеханов: 25 причин попробовать Laravel
ODP
Программирование Linux
PDF
Почему Mojolicious?
PDF
Бессигнатурное обнаружение PHP-бэкдоров
PPTX
file handling in c
PPT
Groovy On Grails
PDF
Cобачники против кинофобов
PDF
Anton Shabouta "Implementing async binary clients in pure PHP"
PDF
Web осень 2013 лекция 2
PDF
Что нового в Perl? 5.10 — 5.16
PPTX
PHP Advanced
PPTX
Подпрограммы
PDF
JavaScript. Loops and functions (in russian)
PPT
бегун
PPTX
Web осень 2013 лекция 9
PPT
бегун
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
Perl: Symbol table
Язык программирования Go для Perl-программистов
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Алексей Плеханов: 25 причин попробовать Laravel
Программирование Linux
Почему Mojolicious?
Бессигнатурное обнаружение PHP-бэкдоров
file handling in c
Groovy On Grails
Cобачники против кинофобов
Anton Shabouta "Implementing async binary clients in pure PHP"
Web осень 2013 лекция 2
Что нового в Perl? 5.10 — 5.16
PHP Advanced
Подпрограммы
JavaScript. Loops and functions (in russian)
бегун
Web осень 2013 лекция 9
бегун
Ad

Viewers also liked (18)

PDF
ECMFA 2016 slides
PPT
Caricatura 34,41
PDF
OCL'16 slides: Models from Code or Code as a Model?
PPT
Birg hku
PDF
Schema list content
PPT
Incorporating Online Strategies Into Your Marketing Mix
PPT
Electric Power Assns and Social Media
PPT
PR and Social Media
PDF
Developing a new Epsilon Language through Annotations: TestLang
PDF
Canon of Design for a new journey in Product Management
PPT
Develop Your Media Strategy
PPT
INSULINO TERAPIA Y PROTECCION RENAL
PDF
MoDELS'16 presentation: Integration of a Graph-Based Model Indexer in Commerc...
PPT
Project management planning
PPT
take over defenses
PPT
Agro Park Ver2
ECMFA 2016 slides
Caricatura 34,41
OCL'16 slides: Models from Code or Code as a Model?
Birg hku
Schema list content
Incorporating Online Strategies Into Your Marketing Mix
Electric Power Assns and Social Media
PR and Social Media
Developing a new Epsilon Language through Annotations: TestLang
Canon of Design for a new journey in Product Management
Develop Your Media Strategy
INSULINO TERAPIA Y PROTECCION RENAL
MoDELS'16 presentation: Integration of a Graph-Based Model Indexer in Commerc...
Project management planning
take over defenses
Agro Park Ver2
Ad

Similar to Что нового в PHP-5.3 (20)

PDF
Чуть сложнее чем Singleton: аннотации, IOC, АОП
PPTX
PHP 5.4: Что нового?
ODP
ZFConf 2010: Zend Framework and Doctrine
ODP
Saint Perl 2009: CGI::Ajax demo
PDF
Zend Framework и мультиязычность
PPTX
Микрофреймворки PHP
PDF
UWDC 2013, Yii2
PDF
Примеры решения типичных задач за рамками ядра Yii2
PPTX
Взломать Web-сайт на ASP.NET? Сложно, но можно!
PPT
Интеграция Яндекс Сервер
PDF
Михаил Давыдов — JavaScript: Базовые знания
PDF
Компиляция скриптов PHP. Алексей Романенко
PPT
Yserver
PPTX
PHP7 - что ожидать?
PDF
Zend framework 2
PDF
Страх и ненависть в исходном коде
PPT
ZFConf 2010: Zend Framework and Multilingual
PDF
Zend Framework и Doctrine
PDF
Михаил Давыдов - JavaScript. Базовые знания
PDF
Михаил Давыдов - Транспорт, ajax
Чуть сложнее чем Singleton: аннотации, IOC, АОП
PHP 5.4: Что нового?
ZFConf 2010: Zend Framework and Doctrine
Saint Perl 2009: CGI::Ajax demo
Zend Framework и мультиязычность
Микрофреймворки PHP
UWDC 2013, Yii2
Примеры решения типичных задач за рамками ядра Yii2
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Интеграция Яндекс Сервер
Михаил Давыдов — JavaScript: Базовые знания
Компиляция скриптов PHP. Алексей Романенко
Yserver
PHP7 - что ожидать?
Zend framework 2
Страх и ненависть в исходном коде
ZFConf 2010: Zend Framework and Multilingual
Zend Framework и Doctrine
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - Транспорт, ajax

Что нового в PHP-5.3

  • 1. Что нового в PHP 5.3 Дмитрий Стогов
  • 2. Немного о себе сотрудник Zend Technologies отдел Advanced Technologies активный разработчик PHP и ZE автор и мантейнер ext/soap мантейнер поддержки FastCGI в PHP автор компоненты OpenID в Zend Frameork автор Turck MMCache
  • 3. Почему 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 __callstatic () Оператор goto Сокращенный условный оператор ?: NOWDOC <<<‘EOF’ EOF; Константа __DIR__
  • 6. Зачем нужны namespace- ы ? Устраняют конфликты имен Разные namespace- ы могут использовать одно и то же имя для разных целей Имя внутри namespace -а имеет единственный смысл Namespace- ы делают имена короче Имена определенные в namespace -ах имеют короткое ( локальное ) имя и уникальное длинное ( квалифицированное ) для использования за пределами namespace -а Имена и namespace -ы могут быть импортированы в другие namespace -ы используя короткое “ имя импорта ”
  • 7. namesapce -ы Один namespace может определяться в нескольких файлах В namespace- е могут определяться классы интерфейсы функции константы PHP код В 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 GET = 1; const PUT = 2; class Request { function __construct ( $method = GET ) { } } function send_request ( Request $request ) { }
  • 9. namespace в нескольких файлах My/Http/Request.php <?php namespace My :: Http ; class Request { } My/Http/Response.php <?php namespace My :: Http ; class Response { } My/Http/Main.php <?php namespace My :: Http ; function send ( Request $req) { return new Response (); }
  • 10. Длинные имена test1.php <?php require_once( “My/Http/Request.php” ); $x = new My :: Http :: Request ();
  • 11. Импорт – оператор “use” Импорт может быть осуществлен посредством оператора “ use ” use My :: Http ; Оператор “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 <?php require_once( “My/Http/Request.php” ); use My :: Http :: Request ; $x = new Request ();
  • 13. Импорт целого namespace- а test4.php <?php require_once( “My/Http/Request.php” ); use My :: Http ; $x = new Http :: Request (); test5.php <?php require_once( “My/Http/Request.php” ); use My :: Http as H ; $x = new H :: Request ();
  • 14. Внутренние имена namespace A :: B ; function foo () { echo __FUNCTION__ ; // A::B::foo } class C { static function bar () { echo __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 = “A::B::foo” ; $callback (); // A::B::foo() $callback = __NAMESAPCE__ . “::foo” ; $callback (); // A::B::foo()
  • 16. namesapce -ы и __autoload <?php use My :: Http :: Request ; function __autoload ( $name ) { require_once( str_replace( “::” , “/” , $name ) . “.php” ); } $x = new Request (); // loads “My/Http/Request.php”
  • 17. Неоднозначности в namespace- ах Разрешение коротких имен : Имена импорта use A :: B :: Foo ; use A :: B :: Bar as Baz ; $x = new 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 (); // 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 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 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 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 is not implemented” ; } } class MySqlDriver extends DummyDriver { const NAME = ‘MySQL’ ; } $db = ‘MySqlDriver’ ; $db :: execute ( ‘SELCT * FROM foo;’ );
  • 23. Оператор GOTO Реализован для поддержки программно-генерируемого кода “ GOTO” внутрь цикла или оператора switch запрещен <?php RETRY : try { … } catch ( Excption $e ) { recovery ( $e ); goto RETRY ; }
  • 24. Оператор ?: $a ?: $ b === $a ? $a : $b
  • 25. NOWDOC Аналог строк в одиночных кавычках <?php $a = 3 ; $b = 5 ; echo <<< EOF $a+$b EOF ; // prints 3+5 echo <<< ‘EOF’ $a+$b EOF ; // prints $a+$b echo <<< “EOF” $a+$b EOF ; // printd 3+5
  • 26. Константа __DIR__ __DIR__ === dirname(__FILE__) <?php class Foo { const BAR = dirname ( __FILE__ ); // error const BAR = __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 Разные установки для разных виртуальных хостов [HOST=www.domain.com] auto_prepend_file = “/var/www/domain/init.php” Собственный аналог .htaccess user_ini.filename = “.user.ini” user_ini.cache_ttl = 300
  • 28. Сборщик мусора Уничтожает циклические структуры <?php $a = array (); $a [0] =& $a ; // refcount is 2 unset ( $a ); echo gc_collect_cycles (); // 1 – number of // collected variables gc_disable (); gc_enable ();