Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

PHP 7 で劇的に改善された PHP

悪いイメージのある PHP (個人の感想です)

PHP はなんとなく悪いイメージがある、そう思っている人はいませんか?

僕も昔はそうでした。

僕は学生の時に、 Java, Scala, Ruby あたりを使っていました。PHP を触ったのは就職してからです。今学生だとしても、 PHP は勉強せず、 Python, Go あたりを勉強しますね。

しかし、 PHP を使って開発されている Web アプリケーションは非常に多いです。PHP には Web アプリケーション向けの便利な機能が大量にあります。

また、 PHP 7 から型周り改善が多く入り、以前の PHP から見違えるようになりました。

なぜ PHP には悪いイメージがあるのか

なぜ PHP が嫌いな人が多いのか、それは、「厳密でない比較演算子 ==」のせいだと思っています。

PHP 8 では、この比較演算子が変更になったことでも話題になりました。

【PHP8.0】非厳密な比較演算子==の挙動が今さら変更になる

↑のQiita記事の例にもありますが、

"true" == 0    // true => PHP 8 からはこれが false に
0 == "0"       // true
"true" == "0"  // false

これの不思議なところは、 "true" == 0 であり、 0 == "0" なのに、"true" == "0" は false になる点である。A = B かつ B = C なのに A = C にならない違和感である。

"true" == 0 がなぜ true になるのか、これは、文字列を int にキャストしようとした時に、文字列が数字から始まっていない場合は、 0 にキャストされるからである。

(int)"true"    // 0
(int)"100"     // 100
(int)"100abc"  // 100
(int)"abc100"  // 0

これは PHP のドキュメントにも書いてある。

https://www.php.net/manual/ja/language.operators.comparison.php

このキャストの挙動は PHP 8 でも変わっていない。== の挙動だけ修正されることになった。

PHP にはカオスな型の比較表があるのは有名だろう。一度見てみると面白いと思う。

https://www.php.net/manual/ja/types.comparisons.php

=== による厳密な比較の表はいるのか?と思ってしまう。

PHP 7 になって良くなったこと

関数の引数や戻り値、プロパティなどに型を書けるようになったのだ。

class Something
{
    private int $id;

    public function setId(int $id)
    {
        $this->id = $id;
    }

    public function getId(): int
    {
        return $this->int
    }

}

昔と比べると、こんなのほんとにPHPなのか?と思うのかもしれないが、これが今の PHP である。

== の挙動は相変わらずだが、型がだいぶきっちりし始めて、ちゃんと書けばかなり使いやすい言語だと感じ始めた。

PHP 8

更に PHP 8 で色々機能が追加された。

Nullsafe operator や

image.png

Union types など、

class Number {
    public function getSomething(): int|float
    {
        // int または float を返す
    }
}

便利な機能が多く追加されている。

PHP の良いところ

やはり Web に特化した言語であり、他の言語にはない機能がいっぱいある。

HTMLの特殊文字をエスケープする関数や、

htmlspecialchars('<html>')  // &lt;html&gt;

クエリ文字列を生成する関数

http_build_query(['a' => 1, 'b' => 2])  // a=1&b=2

JSON に変換する関数に、

json_encode(['a' => 1, 'b' => 2]);  // "{"a":1,"b":2}"

日の出の時間を取得する関数など(何に使うんだ)

$now = time();
date_sunrise($now);  // 04:30

Web に関する関数なら「こんなものもあるんだ」ってものまであります。 Web アプリを開発していると非常に便利です。

あとは、やっぱり利用者が多いので、 Web に知見が多く転がってるのは素晴らしいですね。ググれば大抵の問題は解決します。

PHP の良くない点

実際長年 PHP を触ってきましたが、やっぱり実行速度はコンパイル言語には勝てません。PHP 7 になってかなり高速化されました。PHP 8 は JIT コンパイルになってさらなる高速化が見込めますが、非同期処理が苦手なのもあり、やっぱり遅いです。

会社の新卒研修で Scala を使ったアプリケーションを作ったり、 https://lgtmoon.dev/ も Scala で作ったりしましたが、サーバーが超貧弱にもかかわらずかなりのパフォーマンスが出ます。

ただ Scala はあまりにも知見が少ないので、今なら Go を選択しますかね。当時 Go が有名だったら Go を選んでいたと思います。

まとめ

かなりダラダラと書いてしまいましたが、昔と比べて PHP はかなり良い言語になってきたと思うので、皆さん食わず嫌いせず触ってみるといいかと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away