Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP 5.4 - Features

PHP 5.4 - Features

Presentación sobre los nuevos features de PHP 5.4

- Rendimiento
- Nuevas palabras reservadas
- Formato para nros binarios
- Interfaz JsonSerializable
- session_status
- SessionHandlerInterface
- Hight precision timer
- Clases, Closures & Arrays
- Built-in Server
- Traits
- Opciones y funciones deprecadas

Federico Lozada Mosto

November 27, 2013
Tweet

More Decks by Federico Lozada Mosto

Other Decks in Programming

Transcript

  1. empty_loop 0.320 func() 0.748 0.428 undef_func() 0.760 0.440 int_func() 0.703

    0.384 $x = self::$x 0.685 0.366 self::$x = 0 0.764 0.445 isset(self::$x) 0.639 0.319 empty(self::$x) 0.690 0.370 $x = Foo::$x 0.987 0.667 Foo::$x = 0 1.084 0.765 isset(Foo::$x) 0.928 0.608 empty(Foo::$x) 0.970 0.651 self::f() 1.085 0.765 Foo::f() 1.210 0.890 $x = $this->x 0.752 0.433 $this->x = 0 0.722 0.402 $this->x += 2 0.632 0.312 ++$this->x 0.587 0.267 --$this->x 0.640 0.320 $this->x++ 0.633 0.314 $this->x-- 0.631 0.311 isset($this->x) 0.684 0.365 empty($this->x) 0.662 0.342 $this->f() 0.937 0.617 $x = Foo::TEST 0.555 0.235 new Foo() 2.393 2.074 $x = TEST 0.596 0.276 $x = $_GET 0.546 0.226 $x = $GLOBALS['v'] 0.856 0.536 $x = $hash['v'] 0.592 0.272 $x = $str[0] 0.839 0.520 ------------------------ PHP 5.3: 24.830'' empty_loop 0.196 func() 0.654 0.458 undef_func() 0.599 0.403 int_func() 0.682 0.486 $x = self::$x 0.408 0.212 self::$x = 0 0.487 0.291 isset(self::$x) 0.484 0.288 empty(self::$x) 0.379 0.184 $x = Foo::$x 0.371 0.176 Foo::$x = 0 0.351 0.155 isset(Foo::$x) 0.322 0.126 empty(Foo::$x) 0.346 0.150 self::f() 0.622 0.426 Foo::f() 0.597 0.401 $x = $this->x 0.394 0.198 $this->x = 0 0.528 0.332 $this->x += 2 0.393 0.197 ++$this->x 0.356 0.161 --$this->x 0.357 0.161 $this->x++ 0.381 0.185 $this->x-- 0.396 0.200 isset($this->x) 0.418 0.222 empty($this->x) 0.426 0.230 $this->f() 0.733 0.537 $x = Foo::TEST 0.395 0.199 new Foo() 1.360 1.164 $x = TEST 0.284 0.089 $x = $_GET 0.404 0.208 $x = $GLOBALS['v'] 0.576 0.380 $x = $hash['v'] 0.440 0.244 $x = $str[0] 0.606 0.410 ------------------------ PHP 5.4: 14.946'' empty_loop 0.369 func() 1.318 0.948 undef_func() 1.635 1.265 int_func() 1.068 0.698 $x = self::$x 0.878 0.509 self::$x = 0 0.818 0.448 isset(self::$x) 0.843 0.474 empty(self::$x) 0.879 0.509 $x = Foo::$x 1.107 0.737 Foo::$x = 0 1.054 0.685 isset(Foo::$x) 1.041 0.672 empty(Foo::$x) 1.051 0.682 self::f() 1.412 1.043 Foo::f() 1.725 1.355 $x = $this->x 0.849 0.479 $this->x = 0 0.976 0.607 $this->x += 2 0.824 0.455 ++$this->x 0.704 0.335 --$this->x 0.722 0.352 $this->x++ 0.737 0.367 $this->x-- 0.736 0.366 isset($this->x) 0.814 0.445 empty($this->x) 0.816 0.446 $this->f() 1.418 1.048 $x = Foo::TEST 0.381 0.011 new Foo() 2.692 2.323 $x = TEST 0.674 0.305 $x = $_GET 0.718 0.349 $x = $GLOBALS['v'] 1.018 0.648 $x = $hash['v'] 0.788 0.418 $x = $str[0] 1.291 0.922 ------------------------ PHP 5.2.9: 31.355''
  2. • hex2bin() • http_response_codes() • get_declared_traits() • getimagesizefromstring() • trait_exists()

    • header_register_callback() • class_uses() • session_status() • session_register_shutdown() • mysqli_error_list() • mysqli_stmt_error_list() • etc... • trait • callable • insteadof
  3. <?php class Freddy implements JsonSerializable { public $data = [];

    public function __construct() { $this->data = array( 'Federico', 'Lozada', 'Mosto' ); } public function jsonSerialize() {return $this->data;} } echo json_encode(new Freddy()); //return ["Federico","Lozada","Mosto"] //PHP < 5.4 //{"data":["Federico","Lozada","Mosto"]}
  4. Session Status <?php function status() { $status = session_status(); if($status

    == PHP_SESSION_DISABLED) { echo "Session is Disabled"; } else if($status == PHP_SESSION_NONE ) { echo "Session Enabled but No Session values Created"; } else { echo "Session Enabled and Session values Created"; } } status(); //return Session Enabled but No Session values Created session_start(); status(); //return Session Enabled and Session values Created
  5. Interfaz de Handler de Sessiones Nativa <?php $obj = new

    MySessionHandler; session_set_save_handler( array($obj, "open"), array($obj, "close"), array($obj, "read"), array($obj, "write"), array($obj, "destroy"), array($obj, "gc") ); ANTES
  6. Interfaz de Handler de Sessiones Nativa <?php class MySessionHandler implements

    SessionHandlerInterface { public function open($savePath, $sessionName) {} public function close() {} public function read($id) {} public function write($id, $data) {} public function destroy($id) {} public function gc($maxlifetime) {} } $handler = new MySessionHandler(); session_set_save_handler($handler, true); session_start(); AHORA
  7. <?php // PHP < 5.4 $start = microtime(1); sleep(2); echo

    "time: ", (microtime(1) - $start); //return time: 2.0010209083557 // PHP >= 5.4 sleep(2); $start = $_SERVER['REQUEST_TIME_FLOAT']; echo "time: ".(microtime(1) - $start); //return time: 2.0010209083557
  8. Acceso a metodos en la instanciación <?php class Test {

    public function foo(){ return 'foo';} } echo (new Test())->foo(); //return foo
  9. Callable Type Hint <?php class Test { public function foo()

    {return 'foo';} static public function bar() {return 'bar';} public function __invoke(){return 'invoke';} } function run(callable $func) { echo $func(); } $o = new Test; $var = 'excepcion'; run(['Test', 'bar']); //return bar run([$o, 'foo']); //return foo run($o); //return invoke run($var); //Catchable fatal error: Argument //1 passed to run() must be callable
  10. Closures & $this <?php class Test { protected $name =

    'Mostofreddy'; public function getName() { $callback = function() {return $this->name;}; return $callback; } } $o = new Test; $func = $o->getName(); echo $func(); //return Mostofreddy
  11. Closure::bindTo <?php class A { function __construct($val) {$this->val = $val;}

    function getClosure() { return function() { return $this->val; }; } } $ob1 = new A(1); $ob2 = new A(2); $func = $ob1->getClosure(); echo $func(); //return 1 $func = $func->bindTo($ob2); echo $func(); //return 2
  12. Class::{expr}() syntax <?php class Test { static public function foo(){

    return "method foo";} static public function bar(){ return "method bar";} } $method = true; echo Test::{($method)?'foo':'bar'}(); //return method foo
  13. Sintaxis de array compactos <?php $array = [0, 1, 2,

    3, 4]; var_dump($array); //return array(6) { [0]=> int(0) [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> int(4) }
  14. Array por referencia (Array Deferencing) <?php $txt = "Erase una

    vez"; echo explode(" ", $txt)[0]; //return Erase echo PHP_EOL; function getName() { return array( 'usuario' => array( 'nombre'=>'Federico' ) ); } echo getName()['usuario']['nombre']; //return Federico echo PHP_EOL;
  15. ~/www$ php -S localhost:8080 PHP 5.4.0 Development Server started at

    Mon Apr 2 11:37:48 2012 Listening on localhost:8080 Document root is /var/www Press Ctrl-C to quit. TIP: para usarlo desde una virtual hay que poner 0.0.0.0
  16. ~/www$ vim server.sh #! /bin/bash DOCROOT="/var/www" HOST=0.0.0.0 PORT=80 ROUTER="/var/www/router.php" PHP=$(which

    php) if [ $? != 0 ] ; then echo "Unable to find PHP" exit 1 fi $PHP -S $HOST:$PORT -t $DOCROOT $ROUTER
  17. Ejemplo simple <?php trait Log { public function addLog($m) {echo

    'LOG: '.$m;} } class Test { use Log; public function foo() { $this->addLog('foo'); } } $obj = new Test; $obj->foo(); //return LOG: foo
  18. Multiple Traits <?php trait Log { public function addLog($m) {echo

    'LOG: '.$m;} } trait Mensaje { public function holaMundo() {return "Hola Mundo!";} } class Test { use Log, Mensaje; public function foo() { $this->addLog($this->holaMundo()); } } $obj = new Test; $obj->foo(); //return LOG: Hola Mundo!
  19. Traits: Composicion <?php trait File { public function put($m) {error_log($m,

    3, '/tmp/log');} } trait Log { use File; public function addLog($m) {$this->put('LOG: '.$m);} } class Test { use Log; public function foo() { $this->addLog('test');} } $obj = new Test; $obj->foo(); //return LOG: test
  20. Traits: Herencia <?php trait Hello { public function foo ()

    {return "traits";} public function foo_1() { return $this->foo()." - ".parent::foo(); } } class Base { public function foo() {return 'base';} } class Test extends Base { use Hello; public function foo() {return 'Test';} } $o = new Test; echo $o->foo(); //return Test echo $o->foo_1(); //return Test - base
  21. Traits: Resolviendo conflictos <?php trait Game { public function play()

    {return "Play Game";} } trait Music { public function play() {return "Play Music";} } class Player { use Game, Music; } $o = new Player; echo $o->play();
  22. Traits: Resolviendo conflictos <?php trait Game { public function play()

    {return "Play Game";} } trait Music { public function play() {return "Play Music";} } class Player { use Game, Music; } $o = new Player; echo $o->play(); PHP Fatal error: Trait method play has not been applied, because there are collisions with other trait methods on Player in /var/www/test/test_traits.php on line 10 PHP no resuelve el conflicto automáticamente
  23. Traits: Resolviendo conflictos - insteadof trait Game { public function

    play() {return "Play Game";} } trait Music { public function play() {return "Play Music";} } class Player { use Game, Music { Music::play insteadof Game; } } $o = new Player; echo $o->play(); //return Play Music
  24. Traits: Resolviendo conflictos - rename <?php trait Game { public

    function play() {return "Play Game";} } trait Music { public function play() {return "Play Music";} } class Player { use Game, Music { Game::play as gamePlay; Music::play insteadof Game; } } $o = new Player; echo $o->play(); //return Play Music echo $o->gamePlay(); //return Play Game
  25. Traits: Atributos <?php trait Usuario { protected $nombre; public function

    getName(){ return $this->nombre;} } class Empleado { use Usuario; public function setName($nombre) { $this->nombre = $nombre; } } $o = new Empleado; $o->setName('Federico'); echo $o->getName(); //return Federico
  26. • Safe mode and all related options • magic_quotes_gpc •

    magic_quotes_runtime • magic_quotes_sybase • register_globals • register_long_arrays • define_syslog_variables • y2k_compliance ini options
  27. • session_is_registered() • session_register() • session_unregister() • define_syslog_variables() • get_magic_quotes_gpc

    && get_magic_quotes_runtime siempre devuelven false • import_request_variables() • mysqli_bind_param() • mysqli_bind_result() • mysqli_fetch() • Sqlite (no afecta a sqlite3) Functions & Extensiones
  28. Para los temerosos... Tutorial para instalar de manera fácil varias

    versiones de PHP en un mismo servidor: http://bit.ly/HWJ5lW