Php 7 compliance workshop PHP days verona

121
PHP 7 Compliance workshop Damien Seguy Verona Italia 2016

Transcript of Php 7 compliance workshop PHP days verona

Page 1: Php 7 compliance workshop   PHP days verona

PHP 7 Compliance workshop

Damien Seguy

Verona Italia 2016

Page 2: Php 7 compliance workshop   PHP days verona

Full ahead to PHP 7.0

Changing version is always a big challenge

Backward incompatibilities

New features

Spot, review, fix, repeat

Page 3: Php 7 compliance workshop   PHP days verona

Speaker

Damien Seguy

CTO at exakat

Static code analysis for PHP

Page 4: Php 7 compliance workshop   PHP days verona

Synopsis

What is in the next version ?

Where in my code ?

How to replace this ?

Get documentation

Find issue

Fix code

Page 5: Php 7 compliance workshop   PHP days verona

Migration to PHP 7

Migration to PHP 7.0 and 7.1

From PHP 5.6

No framework, no libraries

Tools, experience, discipline

Page 6: Php 7 compliance workshop   PHP days verona

Destination

Page 7: Php 7 compliance workshop   PHP days verona

Living on the edge

http://php.net/manual/en/migration70.php

Online

UPGRADING TO PHP 7

Free Book, PDF

Davey Shafik is RM for PHP 7.1

Lots of blogs and articles

Page 8: Php 7 compliance workshop   PHP days verona

Living on the bleeding edge

https://github.com/php/php-src/blob/master/UPGRADING

https://github.com/php/php-src/blob/master/NEWS

https://wiki.php.net/rfc

http://bugs.php.net/

Page 9: Php 7 compliance workshop   PHP days verona
Page 10: Php 7 compliance workshop   PHP days verona
Page 11: Php 7 compliance workshop   PHP days verona
Page 12: Php 7 compliance workshop   PHP days verona

Where does code break?

PHP has 3 phases

syntax

definitions

execution

Checked with phplint

Checked with tests

Checked code review

Page 13: Php 7 compliance workshop   PHP days verona

Where will code break?

SyntaxDefinitionsExecution

<?php

function splitNames($fullname, $fullname) {    list($first, $last) = split($fullname, ' '); }

?>

Page 14: Php 7 compliance workshop   PHP days verona

Tools for migration

Your own experience with your code

Lint

Search

Static analysis

Logs

Page 15: Php 7 compliance workshop   PHP days verona

Linting PHP 7

Page 16: Php 7 compliance workshop   PHP days verona

PHP linting

command line : php -l filename.php

Spot parse errors

Works on files only :

For directories, see phplint/phplint

Page 17: Php 7 compliance workshop   PHP days verona

PHP linting

Error messagesin PHP

Page 18: Php 7 compliance workshop   PHP days verona

Backward unlintable code

Page 19: Php 7 compliance workshop   PHP days verona

Code focused on current versions

Page 20: Php 7 compliance workshop   PHP days verona

Backward unlintable code

Page 21: Php 7 compliance workshop   PHP days verona

Redefinition of parameter

<?php

function foo($a, $a, $a) {   print $a."\n"; }

foo('x', 'y', 'z');

?>

Page 22: Php 7 compliance workshop   PHP days verona

Switch statements may only contain one default clause

<?php   

switch($x) {        case '1' :             break;        default :             break;        default :             break;        case '2' :             break;    }   

Page 23: Php 7 compliance workshop   PHP days verona

Switch statements may only contain one default clause

switch($x) {        case 1 :             break;        case 0+1 :             break;        case '1' :             break;        case true :             break;        case 1.0 :             break;        case $y :             break;    }   

Page 24: Php 7 compliance workshop   PHP days verona

Deprecated features

Not happening if a parent case has a __constructor()

Not happening if the class is in a namespaceUse the E_DEPRECATED error level while in DEV

Methods with the same name as their class will not be constructors in a future version of PHP; foo has a deprecated constructor

Page 25: Php 7 compliance workshop   PHP days verona

php -l with other versions

syntax error, unexpected 'new' (T_NEW)

Assigning the return value of new by reference is deprecated (PHP 5.6)

PHP 7 -> PHP 5.6

$o =& new Stdclass();

Page 26: Php 7 compliance workshop   PHP days verona

Migration to PHP 7

Lint with

PHP 7.0

PHP 7.1 (or src)

PHP 5.6 (current)

PHP 5.5, 5.4,… (manual)

Page 27: Php 7 compliance workshop   PHP days verona

PHP 7 linting

Pre-commit

Use different versions

Be ruthless with unlintable files

Page 28: Php 7 compliance workshop   PHP days verona

Where does code break?

PHP has 3 phases

syntax

definitions

execution

Checked with lint

Checked with tests

Checked code review

Page 29: Php 7 compliance workshop   PHP days verona

Static analysis

Page 30: Php 7 compliance workshop   PHP days verona

Presentation

Review code without executing it

Common in C/C++, Java, Javascript

Coming to PHP with PHP 7

Page 31: Php 7 compliance workshop   PHP days verona

GREP/SEARCH

Any searching facility

Pro : High speed, great for keyword search, universal

Cons : Little repeat value, no PHP semantics

Page 32: Php 7 compliance workshop   PHP days verona

Grep on PHP code

1318 reports

doc/_ext/configext.py: parts = text.split("']['")js/codemirror/lib/codemirror.js: var change = {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"};po/zh_CN.po:"example: address can be split into street, city, country and zip."

libraries/Advisor.php: public static function splitJustification($rule)libraries/plugins/ImportCsv.php: $tmp = preg_split('/,( ?)/', $csv_columns);libraries/Config.php: // split file to lines

Page 33: Php 7 compliance workshop   PHP days verona

Static analysis

PHP 5 / 7 Calisthenics

ClearPHP Performance

Page 34: Php 7 compliance workshop   PHP days verona

Static analysis tools

PHP7mar

PHP7cc

Phan

Exakat

PHP inspections

Page 35: Php 7 compliance workshop   PHP days verona

PHP7mar

PHP 7 Migration Assistant Report (MAR)

Alexia : https://github.com/Alexia/php7mar

Works with regex

Produces a .md file

Page 36: Php 7 compliance workshop   PHP days verona

12 results

Page 37: Php 7 compliance workshop   PHP days verona

PHP7cc

PHP 7 Compatibility Checker

Authored by sstalle

https://github.com/sstalle/php7cc

PHP 5, works with "nikic/php-parser": "~1.4"

Display to stdout

Page 38: Php 7 compliance workshop   PHP days verona

8.506s 3 results 27 analysis

php ~/.composer/vendor/bin/php7cc library/

File: /Users/famille/Desktop/analyze/library/Analyzer/Analyzer.php> Line 231: Function argument(s) returned by "func_get_args" might have been modified func_get_args();

File: /Users/famille/Desktop/analyze/library/Analyzer/Functions/MarkCallable.php> Line 32: Nested by-reference foreach loop, make sure there is no iteration over the same array foreach ($lists as $id => &$function) { }

File: /Users/famille/Desktop/analyze/library/Tasks/Analyze.php> Line 118: Possible adding to array on the last iteration of a by-reference foreach loop $dependencies[$v] = $dep;

Checked 873 files in 8.506 seconds

Page 39: Php 7 compliance workshop   PHP days verona

PHAN

Static analysis for PHP

Inited by Rasmus, under work at Etsy

https://github.com/etsy/phan

PHP 7 only, with ext/ast

php ~/.composer/vendor/bin/phan -f phan.in -3 vendor -o phan.out

Page 40: Php 7 compliance workshop   PHP days verona

11.244s 333 results

PhanUndeclaredProperty Reference to undeclared property processedPhanUndeclaredProperty Reference to undeclared property \stdclass->results

PhanNonClassMethodCall Call to method relateTo on non-class type null

PhanStaticCallToNonStatic Static call to non-static method \loader\cypher::saveTokenCounts() defined at library//Loader/Cypher.php:179PhanAccessPropertyProtected Cannot access protected property \tokenizer\token::$alternativeEnding

PhanTypeMismatchArgument Argument 1 (atom) is string but \analyzer\structures\useconstant::atomfunctionis() takes array defined at library//Analyzer/Analyzer.php:415

PhanUndeclaredClassMethod Call to method __construct from undeclared class \reports\xmlwriterPhanUndeclaredVariable Variable $r is undeclared

84 analysis

Page 41: Php 7 compliance workshop   PHP days verona

Exakat

Static analysis engine for PHP

https://github.com/exakat/exakat

PHP 5.2 to 7.1; Uses Neo4j 2.2 and Gremlin

php exakat.phar project -p name

Page 42: Php 7 compliance workshop   PHP days verona

20 mins 6798 results 250 analysis

Page 43: Php 7 compliance workshop   PHP days verona

PHP inspections

Static analysis engine for within the IDE

Vladimir Reznichenko

https://bitbucket.org/kalessil/phpinspectionsea

Written in Java

Runs from within PHPstorm

Page 44: Php 7 compliance workshop   PHP days verona
Page 45: Php 7 compliance workshop   PHP days verona

Write your own?

https://github.com/exakat/php-static-analysis-tools.git

PHP 7 : use ext/ast

PHP 5 :"nikic/php-parser"

Avoid regex but it works

Page 46: Php 7 compliance workshop   PHP days verona

PHP 7.0 : what changes?

Incompatible changes

New features

Features/Incompatibilities from PHP 5.6 => 7.1

Page 47: Php 7 compliance workshop   PHP days verona

How to spot issues?

Code knowledge

lint

Grep / Search

Static analysis

Logs / error_reporting

Unit Tests

What to replace them with ?

Page 48: Php 7 compliance workshop   PHP days verona

Incompatibilities

Page 49: Php 7 compliance workshop   PHP days verona

Incompatibilities

Removed features

Added features

Collateral damages

Page 50: Php 7 compliance workshop   PHP days verona

Removed features

Page 51: Php 7 compliance workshop   PHP days verona

Removed extensions

Extensions

ereg

mssql

mysql

sybase_ct

mycrypt (7.1, pending implementation)

Page 52: Php 7 compliance workshop   PHP days verona

Removed extensions

ext/ereg

ereg

ereg_replace

split

sql_regcase

Page 53: Php 7 compliance workshop   PHP days verona

Removed functions

call_user_method()

call_user_method_array()

Repleacable by $funcname

Replaced by call_user_func() and call_user_func_array()

Partially replaced by variadic

Page 54: Php 7 compliance workshop   PHP days verona

Removed variables

$HTTP_RAW_POST_DATA

Replace it by php://input

php://input is now reusable

Since PHP 5.5

Page 55: Php 7 compliance workshop   PHP days verona

Removed INI

mbstring.internal_encoding

mbstring.http_output

mbstring.http_input

iconv.internal_encoding

iconv.input_encoding

iconv.output_encoding

default_charset}

Page 56: Php 7 compliance workshop   PHP days verona

default_charset

htmlentities()

PHP 5.3 : ISO-8859-1

PHP 5.4 : UTF-8

PHP 5.6 : default_charset (also UTF 8)

Page 57: Php 7 compliance workshop   PHP days verona

Where to look for ?

default_charset

Search for ini_set, ini_get, ini_get_all, ini_restore, get_cfg_var

Search in php.ini, .htaccess

Search for htmlentities(), html_entity_decode() and htmlspecialchars()

Page 58: Php 7 compliance workshop   PHP days verona

Preg_replace and /e

preg_replace(‘/ /e’, ‘evaled code’, $haystack)

replaced by

preg_replace_callback_array()

preg_replace(‘/  /e’, ‘evaled code’, $haystack)

preg_replace_callback_array([‘/  /’ => $closure],  $haystack) preg_replace_callback(‘/  /’,

$closure],  $haystack) 

Page 59: Php 7 compliance workshop   PHP days verona

preg_replace_callback_array<?php 

$code = "abbbb";

$spec = 'c';

echo preg_replace_callback_array(     array(         "/a/" => function($matches) {                         return strtoupper($matches[0]);                  },         "/b/" => function($matches) use ($spec) { static $i = 0; $i++;

               return "B$i$spec";         }     ), $code);

AB1cB2cB3cB4c

Page 60: Php 7 compliance workshop   PHP days verona

preg_replace()

<?php  

$code = "abcde"; 

echo preg_replace(      array( '/a/', '/b/'),      array( 'f' , 'g'),     $code);

fgcde

Page 61: Php 7 compliance workshop   PHP days verona

Added features

Page 62: Php 7 compliance workshop   PHP days verona

Added definitions

Functions Classes Constants5.3 40 2 805.4 0 9 785.5 12 11 575.6 1 10 107.0 10 10 417.1 0 -1 4

Total 1293 153 1149

Page 63: Php 7 compliance workshop   PHP days verona

Name impact

get_resources(), intdiv()

PREG_JIT_STACKLIMIT_ERROR

class Date (from PHP 5.1)

Error (new class in PHP 7)

Page 64: Php 7 compliance workshop   PHP days verona

New functions

intdiv()

get_resources()

random_bytes(), random_int()

error_clear_last()

gc_mem_caches()

preg_replace_callback_array()

Page 65: Php 7 compliance workshop   PHP days verona

Collaterals

Page 66: Php 7 compliance workshop   PHP days verona

Invalid octals are invalid

<?php 

$x = 0890;

Upgraded from silent to Fatal error

PHP Parse error: Invalid numeric literal in test.php

Page 67: Php 7 compliance workshop   PHP days verona

More invalid octals in strings

<?php  

var_dump("\000" === "\400");

Coming in PHP 7.1

https://wiki.php.net/rfc/octal.overload-checking

Page 68: Php 7 compliance workshop   PHP days verona

More reserved keywords

bool, int, float, string, null, true, false are no more available for class / interface / traits names

mixed, numeric, object, resource are reserved for future use

In 7.1, void is also forbidden

Page 69: Php 7 compliance workshop   PHP days verona

More relaxed keywords

Almost all PHP keywords are now authorized inside classes

Methods and constants

Except for class, which can't be a class constant name.

<?php     class foo {    const instanceof = 1;    function use() {        $this->while(4) + foo::instanceof;    } }

Page 70: Php 7 compliance workshop   PHP days verona

Strings may be invalid

<?php 

echo "\u{1F418}\n";

Upgraded to Fatal error> php56 test.php \u{1F418}

> php70 test.php

🐘

<?php 

echo "\u{52A0}\u{6CB9}\u{4E2D}\u{56FD}\n"; //

Page 71: Php 7 compliance workshop   PHP days verona

Strings may be invalid

<?php 

echo "\u{Yes}\n";

PHP Parse error: Invalid UTF-8 codepoint escape sequence in test.php on line 3

\u{

Page 72: Php 7 compliance workshop   PHP days verona

Hexadecimal numeric strings

<?php  

var_dump(1 + 0xf); var_dump(1 + "0xf");

$ php56 test.php int(16) int(16)

$ php70 test.php int(16) int(1)

Page 73: Php 7 compliance workshop   PHP days verona

Md5 pb

Page 74: Php 7 compliance workshop   PHP days verona

Warning for strings (7.1)

<?php  

print "2" + "4"; print "3 elephpants" + "4 dolphins"; print "2" + "d4 d";

6 7 2

Warning: A non-numeric value encountered

Page 75: Php 7 compliance workshop   PHP days verona

Exceptions

Throwable

Exception

LogicException RuntimeException

BadFunctionCallException

BadMethodCallException

DomainExceptionInvalidArgumentException

OutOfRangeException

OutOfBoundsException

OverflowException

RangeException

Error

ParseErrorDivisionByZeroError

AssertionError

Page 76: Php 7 compliance workshop   PHP days verona

Exceptions

\Exception is not the top exception type anymore

It is now the 'throwable' interface

Impact on Exception handler

Avoid type hinting until moved to PHP 7

Impact on Error handler

Impact on catch() clauses

Page 77: Php 7 compliance workshop   PHP days verona

More catching exceptions

<?php

try {   eval($somePHPcode); } catch( ParseError $e) {    log($e->getMessage());   // attempt to fix this or error handling }

Page 78: Php 7 compliance workshop   PHP days verona

More catching exceptions

Parser errors now throw a ParseError object. Error handling for eval()

<?php 

try {    $file = new finfo(FILEINFO_NONE,$magic_file);  } catch( ParseError $e) {     log($e->getMessage());    // attempt to fix this or error handling  }

Page 79: Php 7 compliance workshop   PHP days verona

More catching exceptions

<?php 

try {    $random = new random_bytes(10);   } catch( TypeError $e) {    // invalid parameter } catch( Error $e) {    // invalid length } catch( Exception $e) {    // no source of randomness } 

Page 80: Php 7 compliance workshop   PHP days verona

Negative string offset (7.1)

<?php  

$string = "abcde";

print $string[-3];

print "$string[3]";

print "$string[-2]";

c

d

Parse error: syntax error, unexpected '-', expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING)

Page 81: Php 7 compliance workshop   PHP days verona

list() with keys => (7.1)

Upgraded to Fatal error

<?php   // Assigns to $a, $b and $c to 0, 1, 2list($a, $b, $c) = $array;

// Assigns to $a, $b and $c to the keys //"a", "b" and "c", respectively list("a" => $a, "b" => $b, "c" => $c) = $array;

Page 82: Php 7 compliance workshop   PHP days verona

Call-time pass-by-reference

References are in the function signature

Deprecated warnings until PHP 7

Upgraded to Parse error in PHP 7

<?php  

$a = 3;  

function f($b) {       $b++;   }  

f(&$a);   print $a;   ?>

PHP Parse error: syntax error, unexpected '&' in …

Page 83: Php 7 compliance workshop   PHP days verona

Incompatible context

<?php  class A {       function f() { echo get_class($this); }  }  A::f();  ?>

Notice: Undefined variable: $this in A

Deprecated: Non-static method A::f() should not be called statically inNotice: Undefined variable: $this in A

Page 84: Php 7 compliance workshop   PHP days verona

Easy to spot

Strict Standards: Non-static method A::f() should not be called statically in test.php on line 6

Deprecated: Non-static method A::f() should not be called statically in test.php on line 6

Page 85: Php 7 compliance workshop   PHP days verona

Changed behavior

Page 86: Php 7 compliance workshop   PHP days verona

Changed behavior

Indirect expressions

Page 87: Php 7 compliance workshop   PHP days verona

Search for situations

Search for :: operator

Get the class

then the method

then the static keyword

Use static analysis tool

Page 88: Php 7 compliance workshop   PHP days verona

func_get_arg()

func_get_arg() and func_get_args() now return current argument values

<?php 

function foo($a, $b, $c) {    print_r(func_get_args());    ++$a;    print_r(func_get_args());  }  foo(1,2,3);

Array ( [0] => 1 [1] => 2 [2] => 3 ) Array ( [0] => 2 [1] => 2 [2] => 3 )

Page 89: Php 7 compliance workshop   PHP days verona

Usort<?php

$array = array(     'foo',     'bar',     'php' );

usort($array, function($a, $b) {     return 0; } );

print_r($array);

Array ( [0] => php [1] => bar [2] => foo )Array ( [0] => foo [1] => bar [2] => php )

PHP 5

PHP 7

Page 90: Php 7 compliance workshop   PHP days verona

Automatically fixed

It is not safe to rely on the system's timezone settings. You are required to use the

date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are

still getting this warning, you most likely misspelled the timezone identifier.

Page 91: Php 7 compliance workshop   PHP days verona

Changes to Division By Zero

Also, -0 !!

Page 92: Php 7 compliance workshop   PHP days verona

New features

Page 93: Php 7 compliance workshop   PHP days verona

New features

Breaks backward compatibility sometimes

FUD

Search for places to apply them like for incompatibilities

Page 94: Php 7 compliance workshop   PHP days verona

New features

Fixing

Modernization

New features

Page 95: Php 7 compliance workshop   PHP days verona

Fixing

Page 96: Php 7 compliance workshop   PHP days verona

Don't hide in parentheses<?php function getArray() {     return [1, 2, 3]; }

function squareArray(array &$a) {     foreach ($a as &$v) {         $v **= 2;     } }

// Generates a warning in PHP 7. squareArray((getArray())); ?>

Parenthesis in arguments won't mask error anymore

Page 97: Php 7 compliance workshop   PHP days verona

Constant arrays

Lots of properties should be constants

<?php   class Version {      const SUPPORTED = ['1.0', '1.1', '2.0', '2.1'];     private $an_array = [1,2,3,4];

    public function isSupported($x) {          return isset(Version::SUPPORTED[$x]);     }  }

Page 98: Php 7 compliance workshop   PHP days verona

Constant scalar expressions

Code automation

Keep it simple

Won’t accept functioncalls

Won't accept variables

Page 99: Php 7 compliance workshop   PHP days verona

<?php    class Version {       const MAJOR = 2;       const MIDDLE = ONE;       const MINOR = 1;       const FULL = Version::MAJOR.'.'.Version::MIDDLE.'.' .Version::MINOR.'-'.PHP_VERSION;       const SHORT = Version::MAJOR.'.'.Version::MIDDLE;       const COMPACT = Version::MAJOR.Version::MIDDLE.Version::MINOR;       const AN_ARRAY = [1,2,3,4]; 

    public function f($a = (Version::MAJOR == 2) ?  3 : Version::MINOR ** 3) {  

        return $a;       }   }

Constant scalar expressions

Page 100: Php 7 compliance workshop   PHP days verona

Modernization

Page 101: Php 7 compliance workshop   PHP days verona

Foreach update the actual array

<?php

$array = [0]; foreach ($array as $k => &$val) {     print "$k\n";     $array[] = 1; } ?>

0 1 2 3 4 5 6 7 8 9 10 11

0

Page 102: Php 7 compliance workshop   PHP days verona

Closure binding

<?php class Hello {   private $hello = "Hello";

  function makeClosure() {    return function() {     echo $this->hello;   }; }

$obj = new Hello(); $closure = $obj->makeClosure(); $closure();

Page 103: Php 7 compliance workshop   PHP days verona

Closure binding

<?php

class   {

  private $hello = " ";

}

$obj = new Hello(); $closure = $obj->makeClosure();

$nihao = new  ();

$closure2 = $closure->bindTo($nihao); $closure2();

Page 104: Php 7 compliance workshop   PHP days verona

Closure binding<?php

$closure = function() {     echo $this->hello; };

class   {

  private $hello = " ";

}

$nihao = new  ();

$closure->call($nihao);

Page 105: Php 7 compliance workshop   PHP days verona

session_start($options)

Very Cute <=>

Replaces a lot of code

Mainly useful for usort()

<?php

// PHP 5.6 ini_set('session.name','session'); ini_set('session.gc_probability',1); ini_set('session.gc_divisor',1); session_start();

// PHP 7.0 session_start(['name'  => 'session', 'gc_probability' => 1, 'gc_divisor'  => 1 );

Page 106: Php 7 compliance workshop   PHP days verona

dirname() second argument

<?php   $path = '/a/b/c/d/e/f';

// PHP 5.6 $root = dirname(dirname(dirname($x)));

// PHP 7 $root = dirname($path, 3); ?>

Page 107: Php 7 compliance workshop   PHP days verona

Parameters evolution (7.1)

get_headers() has an extra parameter

Passing a custom stream context

getenv() doesn't need parameter

all the current environment variables will be returned

Page 108: Php 7 compliance workshop   PHP days verona

Really new

Page 109: Php 7 compliance workshop   PHP days verona

Null-coalesce

Shorter way to give a test for NULL and failover

<?php 

// PHP 5.6 $x = $_GET['x'] === null ? 'default' : $_GET['x'];

// PHP 7.0 $x = $_GET['x'] ?? 'default';

?>

Page 110: Php 7 compliance workshop   PHP days verona

Spaceship operator

Very Cute <=>

Replaces a lot of code

Mainly useful for usort()

<?php 

// PHP 5.6 if ($a > $b) {  echo 1; } elseif ($a < $b) {   echo -1; } else {   echo 0; }

// PHP 7.0 echo $a <=> $b; // 0

Page 111: Php 7 compliance workshop   PHP days verona

Generators delegation

New yield keyword

Save memory from

n down to 1 value

Good for long or infinite loops

Search for range(), for() or loops

<?php   function factors($limit) {      yield 2;      yield 3;

    yield from primeTill1000();

    for ($i = 1001; $i <= $limit; $i += 2) {          yield $i;      } } 

$prime = 1357;  foreach (factors(sqrt($prime)) as $n) {      echo "$n ". ($prime % $n ? ' not ' : '') . " factor\n";  }

Page 112: Php 7 compliance workshop   PHP days verona

Generators

New yield from keyword

Save memory from n down to 1 value

Delegate generators

Great for long, unbounded or infinite loops

Search for range(), for(), foreach() or loops

literals, database result sets, file lines

Page 113: Php 7 compliance workshop   PHP days verona

Generatorsreturns

<?php    function factors($limit) {       return 'first';     yield 2;       return 'second';     yield 3;      return 'third';     yield 5;  }  

$gen = factors(sqrt($prime)); foreach ($gen as $n) {       echo "$n\n";     if ($n == 3) {break 1;} }

print $gen->getReturn(); // second

Generators returns

The last return is accessible

The generator returns the final state

Page 114: Php 7 compliance workshop   PHP days verona

Scalar typehint

Whenever type is tested =>

<?php  

function foo($x) {    if (!is_string($x)) {      throw new Exception('Type error while calling ' . __FUNCTION__);    } ... }

<?php   function foo(string $x) { ... }

Page 115: Php 7 compliance workshop   PHP days verona

Scalar typehint back in 5.6

Whenever type is tested =>

<?php   

function foo(string $x) { } foo('that');

Catchable fatal error: Argument 1 passed tofoo() must be an instance of string, string given, called in file..

Page 116: Php 7 compliance workshop   PHP days verona

Various scalar typehint

int, float, bool

string

true, false, null

mixed, object, resource, numeric (RFU)

void (7.1)

Page 117: Php 7 compliance workshop   PHP days verona

Option for strict typing

<?php // Enable strict types declare(strict_types=1);

declare(encoding='ISO-8859-1'); declare(ticks=1);

namespace Foo\Bar; foo('that'); 

Page 118: Php 7 compliance workshop   PHP days verona

Return type hint

<?php

function getData($login) : user {    if (userExists($login)) {      return userDetails($login);    } else {      return null;   } }

scalar, array, callable, class or interfaces

Page 119: Php 7 compliance workshop   PHP days verona

Summary

Check the manuals

PHP lint is your friend

Search in the code

Use static analysis tools

Page 120: Php 7 compliance workshop   PHP days verona

Thank [email protected]

@exakat

https://joind.in/talk/0f76c

Page 121: Php 7 compliance workshop   PHP days verona

The end