Home  >  Article  >  Backend Development  >  Detailed explanation of incompatibility in php7

Detailed explanation of incompatibility in php7

伊谢尔伦
伊谢尔伦Original
2017-06-27 10:10:003138browse

Incompatibility

1. foreach no longer changes the internal array pointer

Before PHP7, when the array was iterated through foreach, the array pointer would move. From now on, this is no longer the case, see the code below.

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

PHP5 output:

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

PHP7 output:

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

2. foreach has better iteration characteristics when traversing by reference.

When traversing the array by reference, foreach now better tracks changes during iterations. For example, to add an iteration value to an array during iteration, refer to the following code:

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

PHP5 output:

int(0)

PHP7 output:

int(0)
int(1)

3. Hexadecimal strings are no longer considered numbers.

Containing hexadecimal strings are no longer considered numbers. Considered to be a number

<?php
var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1"));

PHP5 output:

bool(true)
bool(true)
int(15)
string(2) "oo"

PHP7 output:

bool(false)
bool(false)
int(0)
Notice: A non well formed numeric value encountered in /tmp/test.php on line 5
string(3) "foo"

4. Removed functions in PHP7

The list of removed functions is as follows:

call_user_func() and call_user_func_array() are deprecated starting with PHP 4.1.0.

The deprecated mcrypt_generic_end() function has been removed, please use mcrypt_generic_deinit() instead.

The deprecated mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() and mcrypt_ofb() functions have been removed.

set_magic_quotes_runtime(), and its alias magic_quotes_runtime() have been removed. They have been deprecated in PHP 5.3.0, and are also available in PHP 5.4.0 due to magic quotes. abandoned and lost their function.

The obsolete set_socket_blocking() function has been removed, please use stream_set_blocking() instead.

dl() is no longer available in PHP-FPM, it is still available in the CLI and embed SAPIs.

The following functions in the GD library have been removed: imagepsbbox(), imagepsencodefont(), imagepsextendfont(), imagepsfreefont(), imagepsloadfont(), imagepsslantfont(), imagepstext()

In configuration In the file php.ini, always_populate_raw_post_data, asp_tags, and xsl.security_prefs have been removed.

5. The object created by the new operator cannot be assigned to a variable by reference.

The object created by the new operator cannot be assigned to a variable by reference.

<?php
class C {}
$c =& new C;

PHP5 output:

Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3

PHP7 output:

Parse error: syntax error, unexpected 'new' (T_NEW) in /tmp/test.php on line 3

6. Removed ASP and script PHP tags

Use ASP-like tags and script tags to distinguish PHP The way the code was removed. Affected tags are: 72637aecae1027e7d023ac098a170986, 332000003288cabbdff89f9a8e5a919b, 842e8e9dd470ac0da5d8b75be3525bf2 2cacc6d41bbb37262a98f745aa00fbf0

7. Initiated from unmatched context Calling

statically calling a non-static method in a mismatched context has been deprecated in PHP 5.6, but in PHP 7.0, will result in the $this variable being undefined in the called method, and this behavior has been Deprecated warning.

<?php
class A {
public function test() { var_dump($this); }
}
// 注意:并没有从类 A 继承
class B {
public function callNonStaticMethodOfA() { A::test(); }
}
(new B)->callNonStaticMethodOfA();

PHP5 output:

Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8

object(B)#1 (0) {

}

PHP7 output:

Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8
Notice: Undefined variable: this in /tmp/test.php on line 3

NULL

8. When the value overflows, the internal function will fail

When converting a floating point number to an integer, if the floating point value is too large to be expressed as an integer, in the previous version, the internal function would Truncating the integer directly will not cause an error. In PHP 7.0, if this happens, an E_WARNING error is raised and NULL is returned.

9. JSON extension has been replaced by JSOND

JSON extension has been replaced by JSOND extension. Regarding the processing of numerical values, there are two points to note: First, the numerical value cannot end with a period (.) (for example, the value 34. must be written as 34.0 or 34). Second, if scientific notation is used to express values, e must not be preceded by a period (.) (for example, 3.e3 must be written as 3.0e3 or 3e3)

10. The # comment format in the INI file is removed

In the configuration file INI file, comment lines starting with # are no longer supported. Please use; (semicolon) to indicate comments. This change applies to php.ini and files processed with the parse_ini_file() and parse_ini_string() functions.

11. $HTTP_RAW_POST_DATA has been removed

The $HTTP_RAW_POST_DATA variable is no longer provided. Please use php://input instead.

12. Yield is changed to the right join operator

在使用 yield 关键字的时候,不再需要括号, 并且它变更为右联接操作符,其运算符优先级介于 print 和 => 之间。 这可能导致现有代码的行为发生改变。可以通过使用括号来消除歧义。

<?php
echo yield -1;
// 在之前版本中会被解释为:
echo (yield) - 1;
// 现在,它将被解释为:
echo yield (-1);
yield $foo or die;
// 在之前版本中会被解释为:
yield ($foo or die);
// 现在,它将被解释为:
(yield $foo) or die;

The above is the detailed content of Detailed explanation of incompatibility in php7. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn