머리말
본 글은 강의+후속연구 요약입니다.
그때 유행을 따른다고 해서 php7이 나오자마자 컴퓨터에 설치했는데, php5와 php7이 공존하고 있어서 바로 엄청 시간이 많이 걸리는 루프 스크립트를 작성해서 테스트해 봤는데 php7이 훨씬 더 강력하더군요. . 그런 다음 몇 가지 새로운 추가 기능과 일부 폐기된 사용법에도 주의를 기울였습니다.
PHP 업그레이드가 최우선 사항이기 때문에 회사에서는 가까운 시일 내에 업그레이드할 계획이므로 이전에 개인적으로 php7이 가져온 즐거움에 대해 감사할 수밖에 없습니다. 업그레이드를 담당하는 친구가 꽤 포괄적인 공유를 했습니다. 여기에 표시하여 메모로 사용하세요.
관련 무료 학습 권장 사항: WeChat 애플릿 개발
주요 연구 질문:
1.PHP7이 가져오는 이점
2.PHP7이 가져오는 새로운 것
3.PHP7이 포기함
4 .PHP7이 가져온 변경 사항
5. PHP7
6의 성능을 최대한 활용하는 방법. PHP7을 환영하기 위해 코드를 더 잘 작성하는 방법은 무엇입니까?
7. 현재 프로젝트 코드를 PHP7과 호환되도록 업그레이드하는 방법은 무엇입니까?
PHP7의 이점
예, 성능이 크게 향상되어 시스템을 절약하고 비용을 절감할 수 있습니다.
PHP7에서 가져온 새로운 기능
1. 유형 선언
문자열(string), 정수(int), 부동 소수점 숫자(float) 및 부울 값(bool)을 사용하여 함수를 선언할 수 있습니다. 유형 및 함수 반환 값.
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 >인 경우 $c의 값은 1
$a == $b, $c의 값은 0
$a < $b인 경우 $c의 값은 -1
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를 대체합니다. 이런 식으로 인터프리터(파서)와 컴파일러(컴파일러)를 분리하면 일부 해킹 코드를 줄일 수 있으며 동시에 구현을 더 쉽게 이해하고 유지 관리할 수 있습니다. > 파서 구문 분석 -> PHP 코드 실행 -> AST -> 익명 함수 실행
8 . 유니코드 문자 형식 지원(echo " u{9999}”)
불법 데이터의 코드 삽입을 방지하고 보다 안전한 역직렬화된 데이터를 제공합니다.
10. 네임스페이스 참조 최적화
$anonymous_func = function(){return 'function';}; echo $anonymous_func(); // 输出function
1에 의해 폐기됨. Ereg 정규식mssql
mysql
2. 더 이상 사용되지 않는 기능
다음과 함께 생성자를 사용할 수 없습니다. 같은 이름인스턴스 메서드는 정적 메서드로 호출할 수 없습니다
3. 더 이상 사용되지 않는 함수
메서드 호출
// PHP7以前语法的写法 use FooLibrary\Bar\Baz\ClassA; use FooLibrary\Bar\Baz\ClassB; // PHP7新语法写法 use FooLibrary\Bar\Baz\{ ClassA, ClassB};
call_user_method() call_user_method_array()
Miscellaneous
mcrypt_generic_end() mcrypt_ecb() mcrypt_cbc() mcrypt_cfb() mcrypt_ofb()
$HTTP_RAW_POST_DATA 변수가 제거되었습니다. php://input을 사용하여 대체하세요.
Ini 파일은 더 이상 #으로 시작하는 주석을 지원하지 않습니다. ”
ASP 형식 지원 및 스크립트 구문 지원 제거:
PHP7
1에서 가져온 변경 사항. 문자열 처리 메커니즘 수정
16진수 문자가 포함된 문자열은 더 이상 숫자로 무시되지 않으며 더 이상 다르게 취급되지 않습니다.
set_magic_quotes_runtime set_socket_blocking Split imagepsbbox() imagepsencodefont() imagepsextendfont() imagepsfreefont() imagepsloadfont() imagepsslantfont() imagepstext()
<%
和 < script language=php >
2. 정수 처리 메커니즘 수정
Int64 지원, 다양한 플랫폼에서 정수 길이 통합, 2GB보다 큰 문자열 및 파일 업로드 지원 2^31바이트를 초과할 수 있습니다.
var_dump("0x123" == "291"); // false var_dump(is_numeric("0x123")); // false var_dump("0xe" + "0x1"); // 0 var_dump(substr("f00", "0x1")) // foo
function func(a,a,b, c,c,c) {} ;
报错
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 = 'xy'; list($x, $y) = $str;
空的list()赋值不再允许
list() = [123];
list()现在也适用于数组对象
list($a, $b) = (object)new ArrayObject([0, 1]);
6.变量处理机制修改
对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析,而不是之前的混杂着几个特殊案例的情况。 下面这张表说明了这个解析顺序的变化。
引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了
$arr = []; $arr['a'] = &$arr['b']; $arr['b'] = 1; // php7: ['a' => 1, 'b' => 1] // php5: ['b' => 1, 'a' => 1]
7.杂项
1.debug_zval_dump() 现在打印 “int” 替代 “long”, 打印 “float” 替代 “double”
2.dirname() 增加了可选的第二个参数, depth, 获取当前目录向上 depth 级父目录的名称。
3.getrusage() 现在支持 Windows.mktime() and gmmktime() 函数不再接受 is_dst 参数。
4.preg_replace() 函数不再支持 “\e” (PREG_REPLACE_EVAL). 应当使用 preg_replace_callback() 替代。
5.setlocale() 函数不再接受 category 传入字符串。 应当使用 LC_* 常量。
6.exec(), system() and passthru() 函数对 NULL 增加了保护.
7.shmop_open() 现在返回一个资源而非一个int, 这个资源可以传给shmop_size(), shmop_write(), shmop_read(), shmop_close() 和 shmop_delete().
8.为了避免内存泄露,xml_set_object() 现在在执行结束时需要手动清除 $parse。
9.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 (根据系统内存决定)
4.PGO (Profile Guided Optimization)
第一次编译成功后,用项目代码去训练PHP,会产生一些profile信息,最后根据这些信息第二次gcc编译PHP就可以得到量身定做的PHP7
需要选择在你要优化的场景中: 访问量最大的, 耗时最多的, 资源消耗最重的一个页面.
相关学习推荐:小程序开发教程
위 내용은 php7이 가져오는 성능 향상을 살펴보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!