> 백엔드 개발 > PHP7 > 본문

모든 php7 버전의 새로운 기능 요약 [권장]

藏色散人
풀어 주다: 2023-02-18 08:26:01
앞으로
2496명이 탐색했습니다.

PHP7.1의 새로운 기능

1. Nullable 유형

이제 유형 앞에 물음표를 추가하여 매개변수 유형과 반환 값을 허용할 수 있습니다. 비어 있습니다. 이 기능이 활성화되면 전달된 매개 변수 또는 함수에서 반환된 결과는 지정된 유형이거나 null

#php5
function($a = null){
  if($a===null) {
    return null;
  }
  return $a;
}

#php7+
function fun() :?string
{
  return null;
}

function fun1(?$a)
{
  var_dump($a);
}
fun1(null);//null
fun1('1');//1
로그인 후 복사

2입니다. void 유형

반환 값은 void 유형의 메서드로 선언되거나 단순히 반환문 . void의 경우 NULL은 합법적인 반환 값이 아닙니다.

function fun() :void
{
  echo "hello world";
}
로그인 후 복사

3. 클래스 상수 가시성

class Something
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}
로그인 후 복사

4. iterable pseudo-class

이것은 배열을 허용하거나 Traversable 인터페이스를 구현하는 객체를 나타냅니다.

function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}
로그인 후 복사

5. 다중 예외 캡처 처리

catch 문 블록은 이제 파이프 문자(_|_)를 통해 여러 예외를 캡처할 수 있습니다. 이는 서로 다른 클래스의 서로 다른 예외를 동시에 처리해야 할 때 유용합니다

try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
}
로그인 후 복사

6. 목록은 키 이름을 지원합니다

$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];

// list() style
list("id" => $id1, "name" => $name1) = $data[0];
var_dump($id1);//1
로그인 후 복사

7. 문자열은 음수 방향을 지원합니다

$a= "hello";
$a[-2];//l
로그인 후 복사

8.

Closure에는 콜러블을 Closure 객체로 빠르게 변환하는 정적 메서드가 추가되었습니다.

<?php
class Test
{
    public function exposeFunction()
    {
        return Closure::fromCallable([$this, &#39;privateFunction&#39;]);
    }

    private function privateFunction($param)
    {
        var_dump($param);
    }
}

$privFunc = (new Test)->exposeFunction();
$privFunc('some value');
로그인 후 복사

9. http2 서비스 푸시

이제 CURL 확장에 http2 서버 푸시 지원이 추가되었습니다

원본 링크: https://cloud.tencent.com/dev...

PHP7의 새로운 기능입니다. 2 기능

새로운 객체 유형

이 새로운 객체 유형인 객체는 반공변 매개변수 입력 및 공변 반환에 사용할 수 있는 모든 객체 유형을 도입합니다.

<?php

function test(object $obj) : object
{
    return new SqlQueue();
}

test(new Stdclass());
로그인 후 복사
object, 引进了可用于逆变(contravariant)参数输入和协变(covariant)返回任何对象类型。

<?php

abstract class A
{
    abstract function test(string $s);
}

abstract class B extends A
{
    abstract function test($s) : int;
}
로그인 후 복사

允许重写抽象方法(Abstract method)

当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。

<?php

use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};
로그인 후 복사

使用Argon2算法生成密码散列

Argon2 已经被加入到密码散列(password hashing) API (这些函数以 password_ 开头), 以下是暴露出来的常量:

  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THERADS

允许分组命名空间的尾部逗号

命名空间可以在PHP 7中使用尾随逗号进行分组引入。

$data = ["元素", <<<STR
    Doc Content
    The new line
    STR, 42,];
var_dump($data);

array(3) {
  [0]=>
  string(6) "元素"
  [1]=>
  string(25) "Doc Content
The new line"
  [2]=>
  int(42)
}
로그인 후 복사

PHP7.3新特性

1 发布时间

06 Dec 2018

官网PHP7.3新特性

2 更灵活的HeredocNowdoc语法

结束标记不再需要独立一行或紧跟分号了。同时结束标记也可以使用缩进,使用缩进时doc内容的每行都会跳过相应的缩进。

$v = [10, 20];
[$a, &$b] = $v;
$b += 10;
var_dump($v, $a, $b);

array(2) {
  [0]=>
  int(10)
  [1]=>
  &int(30)
}
int(10)
int(30)
로그인 후 복사

以上语法中,Heredoc 作为一个数组元素出现,同时结束标记没有独立在一行,还有缩进。注意定义的字符串内容,两行的缩进都被剥除了。

3 数组析构支持引用赋值

演示:

$v = [10, 20];
list($c, &$d) = $v;
$d += 10;
var_dump($v, $c, $d);

array(2) {
  [0]=>
  int(10)
  [1]=>
  &int(30)
}
int(10)
int(30)
로그인 후 복사

在为 $b 解析时,使用了引用传递,此时 $b 和 $v[1] 元素保持引用关系。

4 list结构支持引用解析。

演示:

var_dump("literal" instanceof stdClass);
var_dump(42 instanceof stdClass);
var_dump(new stdClass() instanceof stdClass);

bool(false)
bool(false)
bool(true)
로그인 후 복사

5 instanceof 运算符支持字面量语法

instanceof 的第一个运算数支持字面量,非对象型字面量检测的结果为 false。

function methodName($p1, $p2)
{
    // some statmenet
    var_dump($p1, $p2);
}
methodName(10, 20, );

int(10)
int(20)
로그인 후 복사

6 支持调用时参数的尾随逗号

调用函数时,参数列表后允许跟随一个逗号。

bcscale(3);
var_dump(bcscale());

int(3)
로그인 후 복사

调用函数时,第二个(最后一个)参数后,增加了一个逗号是允许的。但定义是不行。

7 BC 数学函数

bcscale()추상 메서드 재정의를 허용합니다

추상 클래스가 다른 추상 클래스에서 상속되면 상속된 추상 클래스가 상속된 추상 클래스의 추상 메서드를 재정의할 수 있습니다.

[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.preload=preload.php
로그인 후 복사
로그인 후 복사

Argon2 알고리즘을 사용하여 비밀번호 해시 생성

Argon2가 비밀번호 해싱 API에 추가되었습니다(이 함수는 비밀번호_로 시작함). 노출된 상수는 다음과 같습니다.

  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THERADS
  • 그룹화된 네임스페이스에서 후행 쉼표를 허용합니다. PHP 7 그룹화를 위해 후행 쉼표를 사용합니다. 소개.
<?php 

function preload()
{
    echo &#39;preload&#39;;
}

opcache_compile_file(&#39;hello.php&#39;);
로그인 후 복사
로그인 후 복사

PHP7.3의 새로운 기능

1 출시 시간

    06 2018년 12월
  • 공식 웹사이트 PHP7.3
  • 2의 새로운 기능 더욱 유연해진 HeredocNowdoc</code > 구문 <li></li>닫는 태그는 더 이상 한 줄에 있거나 뒤에 세미콜론이 올 필요가 없습니다. 동시에, 닫는 태그도 들여쓰기를 사용할 수 있습니다. 들여쓰기를 사용하면 문서 내용의 각 줄에서 해당 들여쓰기를 건너뜁니다. </ul><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php function hello() { echo &amp;#39;hello&amp;#39;; }</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><h2>위 구문에서 Heredoc은 배열 요소로 나타나며 닫는 태그는 별도의 줄에 있지 않고 들여쓰기되어 있습니다. 정의된 문자열 내용에서 두 줄의 들여쓰기가 모두 제거되었습니다. </h2><p>3 배열 파괴는 참조 할당을 지원합니다</p><h2>데모: </h2><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php hello(); echo &amp;#39; &amp;#39;; preload(); echo PHP_EOL;</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><p>$b를 구문 분석할 때 참조 전달이 사용되며 $b 및 $v[1] 요소는 참조 관계를 유지합니다. </p><h2>4 목록 구조는 참조 확인을 지원합니다. </h2><p>데모: </p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">~$ php test.php hello preload</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜5 instanceof 연산자는 리터럴 구문을 지원합니다. 🎜🎜instanceof의 첫 번째 피연산자는 리터럴을 지원하며, 비객체 리터럴 감지 결과는 false입니다. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php class User { /** @var int $id */ private $id; /** @var string $name */ public $name; }</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜6 호출 시 매개변수에 후행 쉼표를 지원합니다. 🎜🎜함수 호출 시 매개변수 목록 뒤에 쉼표가 허용됩니다. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php class User { private int $id; public string $name; }</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜함수 호출 시 두 번째(마지막) 매개변수 뒤에 쉼표를 추가하는 것이 허용됩니다. 그러나 정의가 작동하지 않습니다. 🎜🎜7 BC 수학 함수🎜🎜<code>bcscale() 함수는 현재 BC 함수에서 사용되는 척도 가져오기를 지원합니다. 🎜
    <?php
    
    class Example {
        // 支持除了“void”和“callable”之外的所有类型
        public int $scalarType;
        protected ClassName $classType;
        private ?ClassName $nullableClassType;
     
        // 在静态属性中也是合法的
        public static iterable $staticProp;
     
        // 也可以与“var”一起使用
        var bool $flag;
     
        // 也可以使用默认值
        public string $str = "foo";
        public ?string $nullableStr = null;
     
        // 在一次声明多个属性的情况下,类型会作用于各属性。
        public float $x, $y;
        // 相当于这样:
        public float $x;
        public float $y;
    }
    로그인 후 복사
    로그인 후 복사
    🎜8 LDAP 완전 지원🎜🎜LDAP: 경량 디렉터리 액세스 프로토콜, 경량 디렉터리 액세스 프로토콜이 완벽하게 지원됩니다. 🎜🎜9 멀티 바이트 문자열 함수 업데이트🎜🎜🎜모든 기능을 갖춘 대소문자 매핑 및 대소문자 접기 지원🎜🎜대소문자를 구분하지 않는 문자열 연산자는 대소문자 접기를 사용합니다.🎜🎜유니코드 11 지원🎜🎜긴 문자열 지원🎜 🎜이름이 지정된 캡처 지원🎜 🎜🎜10 FastCGI 프로세스 관리🎜🎜FPM 로깅을 구성하기 위해 다음 옵션을 추가했습니다. (아직 번역되지 않음)🎜🎜🎜log_limit🎜🎜log_buffering🎜🎜 decorate_workers_output🎜🎜🎜11 Argon2id 알고리즘 지원 🎜🎜-- with-password-argon 2[= dir] 매개변수 구성 후. Password_*() 함수에서 Argon2i 및 Argon2id 해시에 대한 지원을 제공했습니다. PASSWORD_ARGON2ID 상수를 사용하여 알고리즘을 지정합니다. PHP에서는 libargon2 라이브러리 버전이 20161029 이상이어야 합니다. 🎜🎜12 CompileError 예외가 일부 컴파일 오류를 대체했습니다. 🎜🎜새로운 CompileError 예외가 추가되었고 ParseError가 이 예외를 상속했습니다. 현재 Token_parse 모드에서 Token_GET_All()로 인해 발생할 수 있는 컴파일 오류에만 영향을 미칩니다. 🎜🎜13 성능 개선🎜🎜PHP7.3은 PHP 7.0보다 22% 빠르다고 합니다. 아직 테스트되지 않았습니다. 기회가 있으면 스트레스 테스트를 해보세요. 🎜

    14 废弃大小写不敏感的常量

    大小写不敏感的常量声明现已被废弃。将 TRUE 作为第三个参数传递给 define() 会导致一个废弃警告。大小写不敏感的使用(在读取时使用一个与声明时不同的大小写方式)也已被废弃。

    15 废弃在字符串中搜索非字符串内容

    将一个非字符串内容传递给字符串搜索函数。 在将来所有待搜索的内容都将被视为字符串,而不是 ASCII 编码值。如果需要依赖这个特性,你应该 要么显示地进行类型转换(转为字符串),或者显示地调用 chr()。 以下是受到影响的方法:

    16 新常量

    新常量

    原文链接:https://zhuanlan.zhihu.com/p/...

    PHP7.4新特性

    1、预加载

    预加载功能是指在服务启动时,未运行任何应用程序代码之前,将一组PHP文件加载到内存中,甚至可以对框架进行预加载,以提高性能。如果对预加载代码进行修改,需要重启服务。

    预加载相比opcache:opcache虽然解决了重复编译问题,但opcache本身也有开销。引用Dmitry Stogov大佬的话:

    Not only. The idea is to completely eliminate compilation and opcache overhead (copying from SHM to process memory and insertions into function/class tables on each request). Using this technique, we might write standard functions and classes in PHP (similar to systemlib.php in HHVM).
    预加载是完全消除编译和opcache所带来的开销(从共享内存复制到进程内存,并在每个请求上插入到function/class表中),使用这种技术可以在PHP中编写标准函数和类(类似于HHVM中的systemlib.php)

    想想看,其实预加载主要是提升像php-fpm这种架构形式的性能,并且会占用更多的内存资源。Benjamin Morel对预加载进行了测试。

    https://github.com/composer/composer/issues/7777#issuecomment-440268416

    使用方法:

    通过修改php.ini中的opcache.preload来选择预加载程序。使用方法如下:

    php.ini

    [opcache]
    zend_extension=opcache.so
    opcache.enable=1
    opcache.enable_cli=1
    opcache.preload=preload.php
    로그인 후 복사
    로그인 후 복사

    preload.php

    <?php 
    
    function preload()
    {
        echo &#39;preload&#39;;
    }
    
    opcache_compile_file(&#39;hello.php&#39;);
    로그인 후 복사
    로그인 후 복사

    hello.php

    <?php 
    
    function hello()
    {
        echo &#39;hello&#39;;
    }
    로그인 후 복사
    로그인 후 복사

    test.php

    <?php
    
    hello();
    echo &#39; &#39;;
    preload();
    echo PHP_EOL;
    로그인 후 복사
    로그인 후 복사

    运行

    ~$ php test.php
    hello preload
    로그인 후 복사
    로그인 후 복사

    2、FFI

    有时间我们再聊,先占上位置。

    3、类属性的类型支持

    php版本<7.4:

    <?php
    
    class User
    {
        /** @var int $id */
        private $id;
    
        /** @var string $name */
        public $name;
    }
    로그인 후 복사
    로그인 후 복사

    php版本>=7.4:

    <?php
    
    class User
    {
        private int $id;
    
        public string $name;
    }
    로그인 후 복사
    로그인 후 복사

    一个完整的示例:

    <?php
    
    class Example {
        // 支持除了“void”和“callable”之外的所有类型
        public int $scalarType;
        protected ClassName $classType;
        private ?ClassName $nullableClassType;
     
        // 在静态属性中也是合法的
        public static iterable $staticProp;
     
        // 也可以与“var”一起使用
        var bool $flag;
     
        // 也可以使用默认值
        public string $str = "foo";
        public ?string $nullableStr = null;
     
        // 在一次声明多个属性的情况下,类型会作用于各属性。
        public float $x, $y;
        // 相当于这样:
        public float $x;
        public float $y;
    }
    로그인 후 복사
    로그인 후 복사

    以下是支持的所有类型:

    bool, int, float, string, array, object
    iterable
    self, parent
    class interface // 任何 类名、接口名
    ?type // 其中“type”可以是以上任意一种类型
    로그인 후 복사

    4、NULL合并赋值运算符

    写法:$a ??= 1 。其实就是 $a = $a ?? 1 的语法糖。

    例子:

    <?php
    
    $arr[&#39;a&#39;] ??= &#39;a&#39;;
    /*等同于*/ $arr[&#39;a&#39;] = $arr[&#39;a&#39;] ?? &#39;a&#39;; 
    
    $b ??= &#39;b&#39;; 
    /*等同于*/ $b = $b ?? &#39;b&#39;;
    로그인 후 복사

    5、弃用WDDX扩展

    我相信大多数人和我一样并不了解wddx,wddx是一个很“古老”的数据格式,基于xml(emmm,可能我理解的不是很对,大概其就是这个意思吧)。现在都在用json,所以弃用了也罢。有兴趣的童鞋可以看一下这篇文章。

    https://blog.csdn.net/guoguo1980/article/details/2436342

    6、简化匿名函数

    此特性就是一个语法糖,相信你在别的语言中也见到过,下面是一些例子:

    <?php
    
    $adder = fn($x, $y) => $x + $y;
    
    // 等同于
    
    $adder = function ($x, $y) {
        return $x + $y;
    };
    
    /*******************************/
    
    $y = 1;
    $fn1 = function ($x) use ($y) {
        return $x + $y;
    }; 
    
    // 等同于
    
    $fn2 = fn($x) => $x + $y;
    
    // 新的写法省去了 use, 变得更加简洁
    로그인 후 복사

    更多用法:

    <?php
    
    fn(array $x) => $x;          // 参数类型声明
    fn(): int => $x;             // 返回类型声明
    fn($x = 42) => $x;           // 参数默认值
    fn(&$x) => $x;               // 引用传递
    fn&($x) => $x;               // 引用返回
    fn($x, ...$rest) => $rest;   // 变长参数
    로그인 후 복사

    其实我个人不是很赞同php引入那么多语法糖,这使得php的语法变得越来越复杂,关于此rfc的投票,鸟哥选择了反对,包括韩天峰大佬也对此特别反对,php应该回归初心——简单高效。

    7、新增mb_str_split函数

    mb_str_split是mbstring扩展中新增的一个函数,通过函数名就可以猜到,它是str_split函数的“增强版(多字节处理)”,它的作用和str_split一样,都是将字符串拆分成数组,只是增加了第三个参数,用于设置字符编码。

    说明:

    mb_str_split ( string $string [, int $split_length = 1, string $encoding = mb_internal_encoding() ] ) : array
    로그인 후 복사

    例子:

    <?php
    print_r(mb_str_split("PHP是世界上最好的语言", 3));
    
    // Array
    // (
    //     [0] => PHP
    //     [1] => 是世界
    //     [2] => 上最好
    //     [3] => 的语言
    // )
    
    // 也可以指定编码
    print_r(mb_str_split("PHP是世界上最好的语言", 3, "GB2312"));
    로그인 후 복사

    8、始终可用的Hash扩展

    从PHP7.4开始,Hash扩展是PHP核心扩展,无法通过--disable-hash禁用,因此它始终可用。

原文链接:https://zhuanlan.zhihu.com/p/60544350

위 내용은 모든 php7 버전의 새로운 기능 요약 [권장]의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!