神刀安全网

PHP 7 Migration Guide Part 1: 10 Backwards Incompatibile Changes – PHP Classes

<< Previous: Will PHP var Keyword …

Author: Atif Shahab Qureshi

Posted on:

Categories: PHP Tutorials

PHP 7 is out since December 2015 and several updates were released. Its advantages compare to PHP 5.x are huge but first you need to consider what are the backwards incompatible changes so you can evaluate the effort that it may take you, so it does not break your existing applications.

Read this article to understand 10 of the most relevant backwards incompatible changes that you need to pay attention before you migrate to PHP 7.

PHP 7 Migration Guide Part 1: 10 Backwards Incompatibile Changes - PHP Classes

By Atif Shahab Qureshi PHP 7 Migration Guide Part 1: 10 Backwards Incompatibile Changes - PHP Classes

cloudways.com/en/

< email contact >

Contents

Introduction

10 Backwards Incompatibilities

Conclusion

Introduction

As we all know, PHP 7 is a new major version and stable release of PHP. It was released on 3rd December 2015. Until now 4 more enhancements have been released. Recently PHP 7.0.4 has been released, which is basically a security and bug fixes release.

PHP 7.0 is mainly all about improvement of language consistency. Before updating towards PHP 7 there are few incompatibilities and features which should be considered first before updating your web site.

This tutorial is the first part of a series about PHP 7 migration guide . In this first part we will discuss backward incompatibility issues so you can be ready to deal with these changes in the code you want to migrate to work with PHP 7.

PHP 7 Migration Guide Part 1: 10 Backwards Incompatibile Changes - PHP Classes

10 Backwards Incompatibilities

1. Changes in Errors and Exception Handling

In PHP 7 changes have been made to default error and exception handling. Therefore, we can� not use custom error handlers as before as now exceptions thrown for those errors.

2. Exception handlers will no longer receive just Exception objects

You can configure an exception handler to handle regular exceptions and exceptions that used to be errors. So the handler function may receive either objects of type Exception or Error.

Since both objects implement the Throwable interface, if you want to use type hinting it is better to declare your handler like this, otherwise it may cause fatal errors and not work as you intended.

void handler( Throwable $ex);

3.Variable Handling

PHP 7 utilizes an abstract syntax tree when parsing source files. It has allowed many improvements which were much needed since the previous versions.

Moreover, evaluation of indirect access now follows the left to right order. Check the following table to understand this better. Hence, the code which was written using right to left approach should be rewritten. Consider the following table from the PHP manual to better understand this concept.

Old and new evaluation of indirect expressions
Expression PHP 5 interpretation PHP 7 interpretation
$$foo[ 'bar' ][ 'baz' ] ${$foo[ 'bar' ][ 'baz' ]} ($$foo)[ 'bar' ][ 'baz' ]
$foo->$bar[ 'baz' ] $foo->{$bar[ 'baz' ]} ($foo->$bar)[ 'baz' ]
$foo->$bar[ 'baz' ]() $foo->{$bar[ 'baz' ]}() ($foo->$bar)[ 'baz' ]()
Foo::$bar[ 'baz' ]() Foo::{$bar[ 'baz' ]}() (Foo::$bar)[ 'baz' ]()

4. list() will not follow reverse order to assign variables

From now on, variable values will be assigned using list() in the order they are defined. Practically, this change will affect the working of array [] operator.

<?php

list($a[], $a[], $a[]) = [1, 2, 3];
var_dump($a);

?>

Output in PHP 5:

array(3) {
[0]=>
int(3)
[1]=>
int(2)
[2]=>
int(1)
}

Output in PHP 7:

array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}

5. Removal of Empty list() Assignments

From PHP 7 onwards, list() cannot be empty. For example these statements are invalid:

<?php

list() = $a;
list(,,) = $a;
list($x, list(), $y) = $a;

?>

list() cannot unpack strings.

6. Array ordering when auto generating by referencing assignments has been changed

The order of the array elements has been changed when generated by reference. Consider the following example:

<?php

$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);

?>

Output in PHP 5:

array(2) {
["b"]=>
∫(1)
["a"]=>
∫(1)
}

Output in PHP 7:

array(2) {
["a"]=>
∫(1)
["b"]=>
∫(1)
}

7. The global Keyword will only be used by simple variables:

Global keyword cannot be used anymore with variable variables. In fact curly braces should be used from now on. In short, it is discouraged to use something other than bare variable with the global keyword. Consider the following example:

<?php

function f() {
// Valid in PHP 5 only.
global $$foo->bar;
// Valid in PHP 5 and 7.
global ${$foo->bar};
}

?>

8.Changes in foreach

foreach does not support the internal array pointer any more. Before PHP 7, whenever an array was traversed using foreach, the internal array pointer used to be modified. In PHP 7 that does not happen anymore. Consider the following example:

<?php

$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump( current( $array ));
}

?>

Output in PHP 5:

int(1)
int(2)
bool(false)

Output in PHP 7:

int(0)
int(0)
int(0)

9. foreach By Reference is Now Improved

Foreach performance was improved as it will track changes made during iteration. To better understand this, consider the following example:

<?php

$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}

?>

Output in PHP 5:

int(0)

Output in PHP7

int(0)
int(1)

10. Changes to Division by 0

In previous versions of PHP, when something is divided or modules by 0, false was returned. In PHP 7, such operation will return NAN, -INF or +INF. Modulus operator % will no longer issues a E_WARNING, as it will throw a DivisionByZeroError. Consider the following example:

<?php

var_dump(3/0);
var_dump(0/0);
var_dump(0%0);

?>

Output in PHP 5:

Warning: Division by zero in %s on line %d
bool(false)
Warning: Division by zero in %s on line %d
bool(false)
Warning: Division by zero in %s on line %d
bool(false)

Output in PHP 7:

Warning: Division by zero in %s on line %d
float(INF)
Warning: Division by zero in %s on line %d
float(NAN)
PHP Fatal error: Uncaught DivisionByZeroError: Modulo by zero in %s line %d

Conclusion

In this post, I have presented 10 backward incompatible changes in PHP 7 so you can have an idea of how much work you will have when migrating your code to PHP 7. In the next part of this tutorial, I will describe new features of PHP 7.

If you liked this article or have any questions about the PHP 7 backwards incompatible changes, post a comment here.

You need to be aregistered user orlogin to post a comment

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » PHP 7 Migration Guide Part 1: 10 Backwards Incompatibile Changes – PHP Classes

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮