>  기사  >  백엔드 개발  >  PHP7을 철저하게 설명하고 PHP7의 새로운 기능을 포괄적으로 소개합니다.

PHP7을 철저하게 설명하고 PHP7의 새로운 기능을 포괄적으로 소개합니다.

PHP中文网
PHP中文网앞으로
2019-05-21 16:00:296360검색

서문

본 글은 강의+후속연구 요약입니다. (스터디 추천: PHP 동영상 튜토리얼)

당시 트렌드라고 하면 php7이 나오자마자 바로 컴퓨터에 설치되더라구요. php5와 php7이 공존하기도 했고, 저도 엄청 시간이 많이 걸리는 루프 스크립트를 바로 작성했고요. 테스트해 보니 실제로 php7은 매우 강력하며 몇 가지 새로운 기능과 일부 폐기된 사용법에도 주의를 기울이고 있습니다.

PHP 업그레이드가 최우선이기 때문에 회사에서는 가까운 시일 내에 업그레이드할 계획이므로 이전에 php7이 개인적으로 가져온 즐거움에 대해 감사할 수밖에 없습니다. 업그레이드를 담당하는 친구가 꽤 포괄적인 공유를 했습니다. 여기에 표시하고 메모로 처리하세요. (추천주제 : PHP7 주제)

PHP7을 철저하게 설명하고 PHP7의 새로운 기능을 포괄적으로 소개합니다.

주요 연구질문 :

1. PHP7이 가져온 장점

2. PHP7이 가져온 포기.

4. PHP7의 변경 사항

5. PHP7의 성능을 최대한 활용하는 방법

6. PHP7에 맞게 더 나은 코드를 작성하는 방법

7. PHP7?

PHP7의 장점예. 성능이 크게 향상되어 기계도 절약되고 비용도 절감됩니다.

PHP7에서 가져온 새로운 기능

1.

문자열, 정수, 부동소수점, 부울을 사용하여 함수의 매개변수 유형과 함수 반환 값을 선언할 수 있습니다.

declare(strict_types=1);
function add(int $a, int $b): int {
    return $a+$b;
}

echo add(1, 2);
echo add(1.5, 2.6);

php5는 위 코드를 실행할 수 없습니다. php7이 실행되면 먼저 3과 오류가 출력됩니다(add()에 전달된 인수 1은 정수 유형이어야 하며 주어진 부동 소수점이어야 함).

두 가지 유형이 있습니다. 스칼라 유형 선언 모드: 필수(기본값) 및 엄격 모드.

declare(strict_types=1)는 코드를 실행하려면 파일의 첫 번째 줄에 배치되어야 하며 현재 파일이 유효합니다!

2. set_Exception_handler()는 더 이상 수신된 내용이 예외 객체여야 한다는 것을 보장하지 않습니다.

PHP 7에서는 많은 치명적인 오류와 복구 가능한 치명적인 오류가 처리를 위해 예외로 변환됩니다. 이러한 예외는 Throwable 인터페이스를 구현하는 Error 클래스에서 상속됩니다(모든 예외는 이 기본 인터페이스를 구현합니다).

PHP7은 개발자의 처리를 더욱 용이하게 하고 개발자가 프로그램을 더 잘 제어할 수 있게 해줍니다. 기본적으로 오류는 프로그램을 직접 중단시키고 PHP7은 오류를 캡처하고 처리하는 기능을 제공하여 프로그램이 계속 실행될 수 있도록 하기 때문입니다. .프로그래머에게는 보다 유연한 옵션이 제공됩니다.

3. 새로운 연산자 ""

구문: ​​$c = $a $b

$a > $b의 값은 1

$a == $b인 경우 $c의 값은 0

$a

4입니다. 새 연산자 "??"

변수가 존재합니다. 값이 NULL이 아니면 자체 값을 반환하고, 그렇지 않으면 두 번째 피연산자를 반환합니다.

//原写法
$username = isset($_GET['user]) ? $_GET['user] : 'nobody';

//现在
$username = $_GET['user'] ?? 'nobody';

5.define()은 상수 배열을 정의합니다

define('ARR',['a','b']);
echo ARR[1];// a

6. AST: 추상 구문 트리, 추상 구문 트리

AST는 PHP 컴파일 프로세스에서 미들웨어 역할을 하며 원본 출력을 직접 대체합니다. opcode 메소드는 인터프리터(파서)와 컴파일러(컴파일러)를 분리하여 일부 Hack 코드를 줄이는 동시에 구현을 더 쉽게 이해하고 유지 관리할 수 있도록 합니다.

PHP5: PHP 코드-> 분석-> OPCODE -> 실행

PHP7: PHP 코드 -> AST -> OPCODE -> 참조: https://wiki.php.net/rfc/abstract_syntax_tree

7. 익명 기능

$anonymous_func = function(){return 'function';};
echo $anonymous_func(); // 输出function

8. 유니코드 문자 형식 지원(echo “u{9999}”)

9. Unserialize는 불법 데이터의 코드 삽입을 방지하는 필터링 기능을 제공합니다. 더 안전한 응답 직렬화된 데이터.

10. 네임스페이스 참조 최적화

// PHP7以前语法的写法 
use FooLibrary\Bar\Baz\ClassA; 
use FooLibrary\Bar\Baz\ClassB; 
// PHP7新语法写法 
use FooLibrary\Bar\Baz\{ ClassA, ClassB};

PHP7

1에 의해 중단되었습니다. Ereg 정규 표현식 mssql mysql

sybase_ct

2. 더 이상 사용되지 않는 기능

같은 이름의 생성자를 사용할 수 없습니다.

인스턴스 메서드는 정적 메서드로 호출할 수 없습니다.

3. 더 이상 사용되지 않는 함수

메서드 호출

call_user_method() 
call_user_method_array()

call_user_func() 및 call_user_func_array()를 사용해야 합니다

加密相关函数
mcrypt_generic_end() 
mcrypt_ecb() 
mcrypt_cbc() 
mcrypt_cfb() 
mcrypt_ofb()

참고: mcrypt_* 시퀀스 함수는 PHP7.1 이후에 제거됩니다. 권장 용도: openssl 시퀀스 기능

Miscellaneous

set_magic_quotes_runtime 
set_socket_blocking 
Split 
imagepsbbox() 
imagepsencodefont() 
imagepsextendfont() 
imagepsfreefont() 
imagepsloadfont() 
imagepsslantfont() 
imagepstext()


4. 더 이상 사용되지 않는 사용법

$HTTP_RAW_POST_DATA 변수가 제거되었습니다. php://input을 사용하여 대체하세요.

Ini 파일은 더 이상 #으로 시작하는 주석을 지원하지 않습니다. ";"


제거된 ASP 형식 지원 및 스크립트 구문 지원:

PHP7带来的变更

1.字符串处理机制修改

含有十六进制字符的字符串不再视为数字, 也不再区别对待.

var_dump("0x123" == "291"); // false
var_dump(is_numeric("0x123")); // false
var_dump("0xe" + "0x1"); // 0
var_dump(substr("f00", "0x1")) // foo

2.整型处理机制修改

Int64支持, 统一不同平台下的整型长度, 字符串和文件上传都支持大于2GB. 64位PHP7字符串长度可以超过2^31次方字节.

// 无效的八进制数字(包含大于7的数字)会报编译错误
$i = 0681; // 老版本php会把无效数字忽略。

// 位移负的位置会产生异常
var_dump(1 >> -1);

// 左位移超出位数则返回0
var_dump(1 << 64);// 0 

// 右位移超出会返回0或者-1
var_dump(100 >> 32);// 0 
var_dump(-100 >> 32);// -1

3.参数处理机制修改

不支持重复参数命名

function func(a,b, c,c) {} ;hui报错

func_get_arg()和func_get_args()这两个方法返回参数当前的值, 而不是传入时的值, 当前的值有可能会被修改


所以需要注意,在函数第一行最好就给记录下来,否则后续有修改的话,再读取就不是传进来的初始值了。

function foo($x) {
    $x++;
    echo func_get_arg(0);
}
foo(1); //返回2

4.foreach修改

foreach()循环对数组内部指针不再起作用

$arr = [1,2,3];
foreach ($arr as &$val) {
    echo current($arr);// php7 全返回0
}

按照值进行循环的时候, foreach是对该数组的拷贝操作

$arr = [1,2,3];
foreach ($arr as $val) {
    unset($arr[1]);
}
var_dump($arr);

最新的php7依旧会打印出[1,2,3]。(ps:7.0.0不行) 

老的会打印出[1,3]

按照引用进行循环的时候, 对数组的修改会影响循环

$arr = [1];
foreach ($arr as $val) {
    var_dump($val);
    $arr[1]=2;
}

最新的php7依旧会追加新增元素的循环。(ps:7.0.0不行)

5. list修改

不再按照相反的顺序赋值

//$arr将会是[1,2,3]而不是之前的[3,2,1]
list($arr[], $arr[], $arr[]) = [1,2,3];

不再支持字符串拆分功能

// $x = null 并且 $y = null
$str = &#39;xy&#39;;
list($x, $y) = $str;

空的list()赋值不再允许

list() = [123];

list()现在也适用于数组对象

list($a, $b) = (object)new ArrayObject([0, 1]);

6.变量处理机制修改

对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析,而不是之前的混杂着几个特殊案例的情况。 下面这张表说明了这个解析顺序的变化。

PHP7을 철저하게 설명하고 PHP7의 새로운 기능을 포괄적으로 소개합니다.引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了

$arr = [];
$arr[&#39;a&#39;] = &$arr[&#39;b&#39;];
$arr[&#39;b&#39;] = 1;
// php7: [&#39;a&#39; => 1, &#39;b&#39; => 1]
// php5: [&#39;b&#39; => 1, &#39;a&#39; => 1]

7.杂项

01.debug_zval_dump() 现在打印 “int” 替代 “long”, 打印 “float” 替代 “double”

02.dirname() 增加了可选的第二个参数, depth, 获取当前目录向上 depth 级父目录的名称。

03.getrusage() 现在支持 Windows.mktime() and gmmktime() 函数不再接受 is_dst 参数。

04.preg_replace() 函数不再支持 “\e” (PREG_REPLACE_EVAL). 应当使用 preg_replace_callback() 替代。

05.setlocale() 函数不再接受 category 传入字符串。 应当使用 LC_* 常量。

06.exec(), system() and passthru() 函数对 NULL 增加了保护.

07.shmop_open() 现在返回一个资源而非一个int, 这个资源可以传给shmop_size(), shmop_write(), shmop_read(), shmop_close() 和 shmop_delete().

08.为了避免内存泄露,xml_set_object() 现在在执行结束时需要手动清除 $parse。

09.curl_setopt 设置项CURLOPT_SAFE_UPLOAD变更

TRUE 禁用 @ 前缀在 CURLOPT_POSTFIELDS 中发送文件。 意味着 @ 可以在字段中安全得使用了。 可使用 CURLFile作为上传的代替。 

PHP 5.5.0 中添加,默认值 FALSE。 PHP 5.6.0 改默认值为 TRUE。. PHP 7 删除了此选项, 必须使用 CURLFile interface 来上传文件。

如何充分发挥PHP7的性能

1.开启Opcache

zend_extension=opcache.so 

opcache.enable=1 

opcache.enable_cli=1

2.使用GCC 4.8以上进行编译

只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)

3.开启HugePage (根据系统内存决定)

PHP7을 철저하게 설명하고 PHP7의 새로운 기능을 포괄적으로 소개합니다.

4.PGO (Profile Guided Optimization)

第一次编译成功后,用项目代码去训练PHP,会产生一些profile信息,最后根据这些信息第二次gcc编译PHP就可以得到量身定做的PHP7

需要选择在你要优化的场景中: 访问量最大的, 耗时最多的, 资源消耗最重的一个页面.

参考: http://www.laruence.com/2015/06/19/3063.html 

参考: http://www.laruence.com/2015/12/04/3086.html

如何更好的写代码来迎接PHP7?

1. 不使用php7废弃的方法,扩展

2. 使用2个版本都兼容的语法特性【 list ,foreach, func_get_arg 等】

如何升级当前项目代码来兼容PHP7?

逐步剔除php7不支持的代码

检测工具:https://github.com/sstalle/php7cc

PHP7을 철저하게 설명하고 PHP7의 새로운 기능을 포괄적으로 소개합니다.

更多资料

위 내용은 PHP7을 철저하게 설명하고 PHP7의 새로운 기능을 포괄적으로 소개합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제