>  기사  >  백엔드 개발  >  PHP7.0 및 php7.1의 새로운 구문 기능 요약

PHP7.0 및 php7.1의 새로운 구문 기능 요약

不言
不言원래의
2018-08-07 11:15:192892검색

이 글은 PHP7.0과 php7.1의 새로운 문법 기능을 요약한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

php7.0의 새로운 기능:

1. Null 병합 연산자(??)

단순한 판단

$param = $_GET['param'] ?? 1;

에 해당:

$param = isset($_GET['param']) ? $_GET['param'] : 1;

2. 선언

두 가지 모드: 필수(기본값) 및 엄격 모드
유형: string, int, float 및 bool

function add(int $a) { 
    return 1+$a; 
} 
var_dump(add(2);

3. 반환 값 유형 선언

함수와 익명 함수 모두 반환 값 유형을 지정할 수 있습니다

function show(): array { 
    return [1,2,3,4]; 
}

function arraysSum(array ...$arrays): array {
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}

4. 우주선 연산자(결합 비교 연산자)

우주선 연산자는 두 식을 비교하는 데 사용됩니다. a가 b보다 크거나 같거나 작을 때 -1, 0 또는 1을 반환합니다. 비교 원칙은 PHP의 일반 비교 규칙을 따릅니다.

// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

5. 익명 클래스

이제 새 클래스를 통해 익명 클래스 인스턴스화를 지원합니다. 이 클래스는 "사용 후 연소"되는 일부 완전한 클래스 정의를 대체하는 데 사용할 수 있습니다.

interface Logger {
    public function log(string $msg);
}

class Application {
    private $logger;

    public function getLogger(): Logger {
        return $this->logger;
    }

    public function setLogger(Logger $logger) {
        $this->logger = $logger;
    }
}

$app = new Application;
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});
var_dump($app->getLogger());

6. 유니코드 코드 포인트 변환 구문

이것은 16진수 형식의 유니코드 코드 포인트를 허용하고 큰따옴표 또는 heredoc로 묶인 UTF-8 인코딩 문자열을 인쇄합니다. 유효한 코드포인트는 모두 허용되며 앞에 오는 0은 생략할 수 있습니다.

 echo "\u{9876}"

이전 버전 출력: u{9876}
새 버전 입력: top

7. Closure::call()

Closure::call()은 이제 더 나은 성능을 제공하고 짧고 간결한 메소드 임시 바인딩을 제공합니다. 개체를 닫고 호출합니다.

class Test {
    public $name = "lixuan";
}

//PHP7和PHP5.6都可以
$getNameFunc = function () {
    return $this->name;
};
$name = $getNameFunc->bindTo(new Test, &#39;Test&#39;);
echo $name();
//PHP7可以,PHP5.6报错
$getX = function () {
    return $this->name;
};
echo $getX->call(new Test);

8. unserialize()

에 대한 필터링을 제공합니다. 이 기능은 신뢰할 수 없는 데이터의 압축을 더 안전하게 풀 수 있는 방법을 제공하도록 설계되었습니다. 화이트리스트를 통해 잠재적인 코드 삽입을 방지합니다.

//将所有对象分为__PHP_Incomplete_Class对象
$data = unserialize($foo, ["allowed_classes" => false]);
//将所有对象分为__PHP_Incomplete_Class 对象 除了ClassName1和ClassName2
$data = unserialize($foo, ["allowed_classes" => ["ClassName1", "ClassName2"]);
//默认行为,和 unserialize($foo)相同
$data = unserialize($foo, ["allowed_classes" => true]);

9, IntlChar

새로 추가된 IntlChar 클래스는 더 많은 ICU 기능을 노출하도록 설계되었습니다. 이 클래스 자체는 여러 문자 집합에서 유니코드 문자를 조작하기 위한 많은 정적 메서드를 정의합니다. Intl은 Pecl 확장입니다. 사용하기 전에 PHP로 컴파일해야 합니다. apt-get/yum/port install php5-intl

printf(&#39;%x&#39;, IntlChar::CODEPOINT_MAX);
echo IntlChar::charName(&#39;@&#39;);
var_dump(IntlChar::ispunct(&#39;!&#39;));

위 루틴은 다음을 출력합니다:
10ffff
COMMERCIAL AT
bool(true)

10, 예상됨

이전 버전과 호환되고 이전 Assert() 메서드가 향상될 것으로 예상됩니다. 이는 프로덕션에서 비용 효율적으로 어설션을 활성화하고 어설션이 실패할 때 특정 예외를 발생시키는 기능을 제공합니다. 이전 버전의 API는 호환성 목적을 위해 계속 유지 관리되며, 이제 Assert()는 계산할 문자열이나 테스트할 부울이 아니라 첫 번째 인수가 표현식이 되도록 허용하는 언어 구성입니다.

ini_set(&#39;assert.exception&#39;, 1);
class CustomError extends AssertionError {}
assert(false, new CustomError(&#39;Some error message&#39;));

위 루틴은 다음을 출력합니다.
치명적인 오류: Uncaught CustomError: 일부 오류 메시지

11, 그룹 사용 선언

이제 동일한 네임스페이스에서 가져온 클래스, 함수 및 상수를 한 번의 사용으로 한 번에 가져올 수 있습니다. 성명 .

//PHP7之前
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// PHP7之后
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

12.intp()

두 개의 매개변수를 피제수와 제수로 받고, 나누기 결과의 정수 부분을 반환합니다.

var_dump(intp(7, 2));

Output int(3)

13, CSPRNG

두 가지 새로운 함수: random_bytes() 및 random_int()를 암호화하고 보호된 정수 및 문자열을 생성할 수 있습니다. 즉, 난수는 안전해집니다.
random_bytes - 암호화로 보호된 의사 난수 문자열
random_int - 암호화로 보호된 의사 난수 정수

14, preg_replace_callback_array()

새로운 함수 preg_replace_callback_array()가 추가되었습니다. 이 함수를 사용하면 더 많은 코드를 사용할 수 있습니다. preg_replace_callback() 함수를 사용할 때 우아합니다. PHP7 이전에는 모든 정규식에 대해 콜백 함수가 호출되었으며 일부 분기에서는 콜백 함수가 오염되었습니다.

15. 세션 옵션

이제 session_start() 함수는 php.ini의 세션 구성 항목을 재정의할 수 있는 배열을 매개변수로 받을 수 있습니다.
예를 들어, 캐시_리미터를 비공개로 설정하고 읽은 후 즉시 세션을 닫습니다.

session_start([&#39;cache_limiter&#39; => &#39;private&#39;,
               &#39;read_and_close&#39; => true,
]);

16. 생성기의 반환 값

생성기의 개념은 PHP5.5에서 도입되었습니다. 생성기 함수가 실행될 때마다 Yield로 식별되는 값을 얻습니다. PHP7에서는 생성기 반복이 완료되면 생성기 함수의 반환 값을 얻을 수 있습니다. Generator::getReturn()을 통해 얻습니다.

function generator() {
    yield 1;
    yield 2;
    yield 3;
    return "a";
}

$generatorClass = ("generator")();
foreach ($generatorClass as $val) {
    echo $val ." ";

}
echo $generatorClass->getReturn();

출력은 다음과 같습니다. 1 2 3 a

17. 생성기에 다른 생성기를 도입합니다.

생성기에 하나 또는 여러 생성기를 도입할 수 있습니다. functionName1

function generator1() {
    yield 1;
    yield 2;
    yield from generator2();
    yield from generator3();
}

function generator2() {
    yield 3;
    yield 4;
}

function generator3() {
    yield 5;
    yield 6;
}

foreach (generator1() as $val) {
    echo $val, " ";
}

출력: 1 2 3 4 5 6

18. Define()

define(&#39;ANIMALS&#39;, [&#39;dog&#39;, &#39;cat&#39;, &#39;bird&#39;]);
echo ANIMALS[1]; // outputs "cat"

php7.1의 새로운 기능:

1. Nullable 유형

을 통해 상수 배열을 정의합니다. 활성화된 경우 전달된 매개변수 또는 함수에서 반환된 결과는 지정된 유형이거나 null입니다. 앞에 물음표를 붙여 유형을 null 허용으로 만들 수 있습니다.

function test(?string $name) {
    var_dump($name);
}

위 루틴은 다음을 출력합니다:

string(5) "tpunt"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...

2、Void 函数

在PHP 7 中引入的其他返回值类型的基础上,一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null 不是一个合法的返回值。

function swap(&$left, &$right) : void {
    if ($left === $right) {
        return;
    }
    $tmp = $left;
    $left = $right;
    $right = $tmp;
}
$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);

以上例程会输出:

null
int(2)
int(1)

试图去获取一个 void 方法的返回值会得到 null ,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。

3、短数组语法 Symmetric array destructuring

短数组语法([])现在可以用于将数组的值赋给一些变量(包括在foreach中)。 这种方式使从数组中提取值变得更为容易。

$data = [
    [&#39;id&#39; => 1, &#39;name&#39; => &#39;Tom&#39;],
    [&#39;id&#39; => 2, &#39;name&#39; => &#39;Fred&#39;],
];
while ([&#39;id&#39; => $id, &#39;name&#39; => $name] = $data) {
    // logic here with $id and $name
}

 4、类常量可见性

现在起支持设置类常量的可见性。

class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

5、iterable 伪类

现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable。

function iterator(iterable $iter) {
    foreach ($iter as $val) {
        //
    }
}

6、多异常捕获处理

一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。

try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
} catch (\Exception $e) {
    // ...
}

7、list()现在支持键名

现在list()支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)

$data = [
    [&#39;id&#39; => 1, &#39;name&#39; => &#39;Tom&#39;],
    [&#39;id&#39; => 2, &#39;name&#39; => &#39;Fred&#39;],
];
while (list(&#39;id&#39; => $id, &#39;name&#39; => $name) = $data) {
    // logic here with $id and $name
}

8、支持为负的字符串偏移量

现在所有接偏移量的内置的基于字符串的函数都支持接受负数作为偏移量,包括数组解引用操作符([]).

var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));

以上例程会输出:

string (1) "e"
int(3)

9、ext/openssl 支持 AEAD

通过给openssl_encrypt()和openssl_decrypt() 添加额外参数,现在支持了AEAD (模式 GCM and CCM)。 
通过 Closure::fromCallable() 将callables转为闭包 
Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。

class Test {
    public function exposeFunction() {
        return Closure::fromCallable([$this, &#39;privateFunction&#39;]);
    }
    private function privateFunction($param) {
        var_dump($param);
    }
}
$privFunc = (new Test)->exposeFunction();
$privFunc(&#39;some value&#39;);

以上例程会输出:

string(10) "some value"

10、异步信号处理 Asynchronous signal handling

A new function called pcntl_async_signals() has been introduced to enable asynchronous signal handling without using ticks (which introduce a lot of overhead). 
增加了一个新函数 pcntl_async_signals()来处理异步信号,不需要再使用ticks(它会增加占用资源)

pcntl_async_signals(true); // turn on async signals
pcntl_signal(SIGHUP,  function($sig) {
    echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);

以上例程会输出:

SIGHUP

11、HTTP/2 服务器推送支持 ext/curl

Support for server push has been added to the CURL extension (requires version 7.46 and above). This can be leveraged through the curl_multi_setopt() function with the new CURLMOPT_PUSHFUNCTION constant. The constants CURL_PUST_OK and CURL_PUSH_DENY have also been added so that the execution of the server push callback can either be approved or denied. 
翻译: 
对于服务器推送支持添加到curl扩展(需要7.46及以上版本)。 
可以通过用新的CURLMOPT_PUSHFUNCTION常量 让curl_multi_setopt()函数使用。 
也增加了常量CURL_PUST_OK和CURL_PUSH_DENY,可以批准或拒绝 服务器推送回调的执行

相关文章推荐:

php7和php5有什么不同之处?php5与php7之间的对比

PHP新特性:finally关键字的用法

위 내용은 PHP7.0 및 php7.1의 새로운 구문 기능 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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