백엔드 개발 PHP7 PHP7로 업그레이드를 계획하고 있는 분들을 위한 메시지

PHP7로 업그레이드를 계획하고 있는 분들을 위한 메시지

Jan 28, 2021 am 09:41 AM

PHP7로 업그레이드를 계획하고 있는 분들을 위한 메시지

추천(무료) : PHP7

서문

본 글은 강의를 듣고 후속 연구를 요약한 것입니다.
그 당시에는 패션을 추구하면서 php7이 나오자마자 바로 컴퓨터에 설치했습니다. php5와 php7이 공존하고 있었기 때문에 즉시 엄청난 시간이 소요되는 루프 스크립트를 작성하고 테스트해 본 결과 php7이 훨씬 강력했습니다. . 그런 다음 몇 가지 새로운 추가 기능과 일부 폐기된 사용법에도 주의를 기울였습니다.
PHP 업그레이드가 최우선 사항이기 때문에 회사에서는 가까운 시일 내에 업그레이드할 계획이므로 개인적으로 php7이 가져온 즐거움에 감사할 수밖에 없었습니다. 업그레이드를 담당하는 친구가 꽤 포괄적인 공유를 했습니다. 여기에 표시하여 메모로 사용하세요.

주요 연구 질문:
1. PHP7이 가져온 이점
2. PHP7이 가져온 새로운 것
3. PHP7이 가져온 노후화
4. PHP7이 가져온 변화
5. PHP7의 성능을 최대한 활용하는 방법
6 . PHP7을 충족하기 위해 코드를 더 잘 작성하는 방법은 무엇입니까?
7. 현재 프로젝트 코드를 PHP7과 호환되도록 업그레이드하는 방법은 무엇입니까?

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 >

$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 코드를 줄일 수 있으며 동시에 구현을 더 쉽게 이해하고 유지 관리할 수 있습니다. ->파서 구문 분석->OPCODE -> 실행

PHP7: PHP 코드 -> AST -> OPCODE 실행


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.Abandoned 확장

Ereg 정규 표현식

mssql

mysql
sybase_ct

2 .Depre cated Feature

동일한 생성자 name은 사용할 수 없습니다

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


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()

참고: *

PHP7.1 이후에는 모든 mcrypt_

시퀀스 함수가 ​​제거됩니다. 권장 용도: openssl 시퀀스 기능

기타

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 > 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 = 'xy';
list($x, $y) = $str;
로그인 후 복사

空的list()赋值不再允许

list() = [123];
로그인 후 복사

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

list($a, $b) = (object)new ArrayObject([0, 1]);
로그인 후 복사

6.变量处理机制修改

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

PHP7로 업그레이드를 계획하고 있는 분들을 위한 메시지

引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了

$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 (根据系统内存决定)

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. 두 버전 모두와 호환되는 구문 기능을 사용하세요[list, foreach, func_get_arg 등]

현재 프로젝트 코드를 PHP7과 호환되도록 업그레이드하는 방법은 무엇인가요?

지원되지 않는 코드인 php7을 점차적으로 제거하세요

탐지 도구: https://github.com/sstalle/php7cc

PHP7로 업그레이드를 계획하고 있는 분들을 위한 메시지

위 내용은 PHP7로 업그레이드를 계획하고 있는 분들을 위한 메시지의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)