当您想编写安全类型的PHP代码时,可以使用PHP7进行

PHP7

大家好,我非常喜欢能够运行的PHP。你们有没有想过,如果能够将这样轻松随意的PHP编写得更加类型安全,会更加喜欢呢?我是这样想的。

經過滿應該這種熱切要求(我想)的回應,PHP7正式發佈已經半年多了。
我想已經有很多人試用過了,為了更喜歡PHP,我也使用了PHP7的三大新功能,來寫了些有類型安全的PHP,現在我將整理這個結果。

順便一提,PHP7的三个主要新功能是…

    • スカラー型宣言

int, string, bool がタイプヒンティングに使えるようになった。

戻り値の型宣言

引数と同様に関数の戻り値でも型宣言出来るようになった。

Null合体演算子

三項演算子と isset() 地獄から解放される。 ?? と書く。

这是关于(我随便取的名字)。

进行实验

因为我试着写了很多东西,所以我会按顺序介绍给大家。
另外,PHP版本是7.0.7。

验证1

这个样例程序只是将英语、数学和语文的分数相加,并显示总分。
我马上写一下。

<?php

function calculate_total_score(array $scores): int
{
    $english = $scores['english'] ?? 0;
    $math = $scores['math'] ?? 0;
    $japanese = $scores['japanese'] ?? 0; 

    $totalScore = $english + $math + $japanese;
    return $totalScore;
}

$scores = array();
$scores['english'] = 70;
$scores['math'] = 80;
$scores['japanese'] = 60;

$totalScore = calculate_total_score($scores);

echo '合計点は' . $totalScore . 'でした。' . "\n";
$ php seven1.php
合計点は210でした。

首先,现在可以在函数参数中使用标量类型,所以写作 (array $scores)。
然后,为了指定函数的返回类型,在参数后面写上 : int 。
这样就能写出类型安全的PHP!类型安全的PHP真是太强大了!

验证二

现在,让我们在这里验证一下是否真的是类型安全的。

<?php

function calculate_total_score(int $scores): int
{
    $english = $scores['english'] ?? 0;
    $math = $scores['math'] ?? 0;
    $japanese = $scores['japanese'] ?? 0;

    $totalScore = $english + $math + $japanese;

    return $totalScore;
}

$scores = array();
$scores['english'] = 70;
$scores['math'] = 80;
$scores['japanese'] = 60;

$totalScore = calculate_total_score($scores);

echo '合計点は' . $totalScore . 'でした。' . "\n";

我已将参数的类型从array更改为int。
执行结果如下所示。

$ php seven2.php
Fatal error: Uncaught TypeError: Argument 1 passed to calculate_total_score() must be of the type integer, array given

出错了!PHP7真是太棒了!

第三项验证

我们也尝试更改返回值。

<?php

function calculate_total_score(array $scores): array
{
    $english = $scores['english'] ?? 0;
    $math = $scores['math'] ?? 0;
    $japanese = $scores['japanese'] ?? 0;

    $totalScore = $english + $math + $japanese;

    return $totalScore;
}

$scores = array();
$scores['english'] = 70;
$scores['math'] = 80;
$scores['japanese'] = 60;

$totalScore = calculate_total_score($scores);

echo '合計点は' . $totalScore . 'でした。' . "\n";
$ php seven3.php
Fatal error: Uncaught TypeError: Return value of calculate_total_score() must be of the type array, integer returned

被好好训斥了呢,果然PHP7太棒了。
不料事情还没完呢…。

验证④

为了安全起见,我们再多进行一些验证。
在验证3中,我们将返回值的类型指定为数组,但让我们尝试一下将其指定为字符串。

<?php

function calculate_total_score(array $scores): string
{
    $english = $scores['english'] ?? 0;
    $math = $scores['math'] ?? 0;
    $japanese = $scores['japanese'] ?? 0;

    $totalScore = $english + $math + $japanese;

    return $totalScore;
}

$scores = array();
$scores['english'] = 70;
$scores['math'] = 80;
$scores['japanese'] = 60;

$totalScore = calculate_total_score($scores);

echo '合計点は' . $totalScore . 'でした。' . "\n";

执行此操作时…

$ php seven4.php
合計点は210でした。

哇塞,简直了不起的 PHP!不好解决问题,但这个程度还可以。

验证第五步

那么,让我们将返回值的类型指定为布尔类型。

<?php

function calculate_total_score(array $scores): bool
{
    $english = $scores['english'] ?? 0;
    $math = $scores['math'] ?? 0;
    $japanese = $scores['japanese'] ?? 0;

    $totalScore = $english + $math + $japanese;

    return $totalScore;
}

$scores = array();
$scores['english'] = 70;
$scores['math'] = 80;
$scores['japanese'] = 60;

$totalScore = calculate_total_score($scores);

echo '合計点は' . $totalScore . 'でした。' . "\n";

当您执行这个操作时,…

$ php seven5.php
合計点は1でした。

\(^o^)/太好了
不仅成功运行,而且得了一分。
我已经厌倦了PHP。。我要尝试Ruby。。

验证⑥

在虚弱的眼神中,我半信半疑地瞄着手册,思索着PHP是否早就具备了类型安全性… 好吧,手册上的描述是这样的。

在中文中,标量类型的声明有两种方式。一是默认的自动转换(coercive)模式,二是严格判断(strict)模式。

なんだってー!!
もしかして strict モードにすればよいのでは??

所以我试着做了一下。

<?php
declare(strict_types=1);

function calculate_total_score(array $scores): bool
{
    $english = $scores['english'] ?? 0;
    $math = $scores['math'] ?? 0;
    $japanese = $scores['japanese'] ?? 0;

    $totalScore = $english + $math + $japanese;

    return $totalScore;
}

$scores = array();
$scores['english'] = 70;
$scores['math'] = 80;
$scores['japanese'] = 60;

$totalScore = calculate_total_score($scores);

echo '合計点は' . $totalScore . 'でした。' . "\n";

要将严格模式打开,需要写上 declare(strict_types=1)。

如果用这个来执行的话

$ php seven6.php
PHP Fatal error:  Uncaught TypeError: Return value of calculate_total_score() must be of the type boolean, integer returned

凯塔━━━━(゚∀゚)━━━━!!

出现了错误。

結論 –
結果

    • PHPでタイプセーフなコードを書きたいときは strict モードにしましょう。

 

    • PHPのせいにせずちゃんとマニュアルを読みましょう(自戒)

 

    PHP7最高!

请参考以下网站

『PHP:新功能-手册』
http://php.net/manual/zh/migration70.new-features.php

广告
将在 10 秒后关闭
bannerAds