ホームページ > バックエンド開発 > PHPチュートリアル > PHP7.0 および php7.1 の新しい構文機能の概要

PHP7.0 および php7.1 の新しい構文機能の概要

不言
リリース: 2023-04-03 17:18:01
オリジナル
2944 人が閲覧しました

この記事は、PHP7.0 と php7.1 の新しい文法機能をまとめたものです。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。

php7.0 の新機能:

1、空のマージ演算子 ( ? ?)

簡易判定

$param = $_GET['param'] ?? 1;
ログイン後にコピー

は、

$param = isset($_GET['param']) ? $_GET['param'] : 1;
ログイン後にコピー

2と同等です。2種類の変数型宣言

モード: 必須 (デフォルト) および厳密モード
型: string、int、float、および bool

function add(int $a) { 
    return 1+$a; 
} 
var_dump(add(2);
ログイン後にコピー

3、戻り値の型宣言

関数および匿名function 戻り値の型を指定できます

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. Spaceship 演算子 (結合比較演算子)

spaceship 演算子は、2 つの式を比較するために使用されます。 a が b より大きい場合、b 以下の場合、または 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. Unicode コードポイント変換構文

これは、Unicode コードポイントを 16 進数形式で受け入れ、二重引用符で囲まれた UTF-8 またはヒアドキュメントのエンコード形式文字列を出力します。有効なコードポイントはどれでも受け入れられ、先頭の 0 は省略できます。

 echo "\u{9876}"
ログイン後にコピー

古いバージョンの出力: \u{9876}
新しいバージョンの入力: Top

7、Closure::call()

クロージャ: :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 関数を公開するように設計されています。このクラス自体は、複数の文字セットの Unicode 文字を操作するための多くの静的メソッドを定義します。 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;));
ログイン後にコピー

上記のルーチンは出力します:
致命的エラー: 捕捉されないカスタムエラー: エラー メッセージ

11、グループ使用宣言

同じ名前空間にインポートされたクラス、関数、定数を、1 つの use ステートメントで一度にインポートできるようになりました。

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

2 つのパラメータを被除数と除数として受け取り、除算結果の整数部分を返します。

var_dump(intp(7, 2));
ログイン後にコピー

Output int(3)

13, CSPRNG

2 つの新しい関数、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 のセッション設定項目をオーバーライドできます。
たとえば、cache_limiter をプライベートに設定し、読み取り後すぐにセッションを閉じます。

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. 他のジェネレーターをジェネレーターに導入する

別のジェネレーターまたは複数のジェネレーターをジェネレーターに導入できます。ジェネレーターは、単に yield from 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, " ";
}
ログイン後にコピー

Output: 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. Null 許容型

型 NULL が許可されるようになりました。この機能が有効な場合、渡されるパラメーターまたは関数によって返される結果は、指定された型または 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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート