当您想编写安全类型的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