Help us understand the problem. What is going on with this article?

PHPWeekly 191114 簡単サマリー

More than 1 year has passed since last update.

PHPWeeklyの内容を簡単に翻訳し、興味のある内容に対してコメントを残します。

知っている知識の中で、ブログを書こうと思っていますが、間違ってる内容が含まれている可能性もあります。

間違っているところに対する指摘はいつも歓迎ですが、非難・悪口は求めていません。

始まる前に

  1. PHP 7.4が発表され、SymfonyとLaravelにも7.4が適用されました。

  2. ブログを作成しながら知らなかったことを調べたり、補足したりするのにかなり時間がかかりました。
    やっぱり勉強し続けないとプログラマーとして衰えることも改めて思いました。

記事

PHP 7.4 ガイド

新しく追加された機能を簡単に記録します。

1. タイプ指定が可能になりました。

class User {
    private int $id;
    public string $name = "Nico";
    public iterable $iterables;
    protected ClassName $classType;
    public ?string $void = null;
    public float $x, $y;
    var bool $flag;
}

2. スプレッド演算子

Argument Unpackingとも呼ばれるスプレッド演算子は実は 5.6 バージョンから使用可能でしたが、関数の引数だけ使用可能でした。

PHP 7.4 バージョンからは配列を定義する時から使用可能になりました。

$mammals = ['bear', 'ape'];
$animals = ['owl', 'crocodile', ...$mammals, 'frog'];
$domain = [...$animals, $fungus, $plant];

3. アローファンクション

JavaScriptでアローファンクションが楽っていうことをわかりました。

やっとPHPでも使えるようになりました。

$domain = ['bear', 'ape', 'pine', 'lettuce','porcino', 'portobello'];
$plurals = array_map(fn($domains) => count($domains), $domains);

4. データが NULLの場合の対応演算子

$this->request->data['theAnimalSpecieThatIsTheKingOfTheSavanna'] ??= 'none';
// 위의 문법은 정확히 아래와 같다.
$this->request->data['theAnimalSpecieThatIsTheKingOfTheSavanna'] = $this->request->data['theAnimalSpecieThatIsTheKingOfTheSavanna'] ?? 'none';

5. Covariant リターン値と Contravariant 引数

説明がまとまらないため、二つに分けて説明します。

5-1. Covariant リターン値

以前には関数をOverrideするとき、リターン値は親クラスのリターンタイプから帰ることができませんでした。

でも7.4バージョンではリターンタイプをサブタイプに変更することができます。

interface Factory
{
    function make(): object;
}

class UserFactory implements Factory
{
    function make(): User
    {
        // implements ...
    }
}
5-2. Contravariant 引数

子クラスで関数をOverrideする場合、引数をスーパータイプに変更することができます。

interface Concatable
{
    function concat(Iterator $input)
}

class Collection implements Concatable
{
    function concat(iterable $input)
    {
        // implements ...
    }
}

6. Weak References

C#, Java, Pythonには既に実装されているWeak ReferencesがPHPにも実装されました。

Weak Referencesは参照されたオブジェクトが破壊されると、参照したオブジェクトも破壊される参照の形態を意味します。

$obj = new stdClass;
$weakref = WeakReference::create($obj);
var_dump($weakref->get());
unset($obj);
var_dump($weakref->get());

7. プリローディング(Preloading)

サービスの速度を改善するためにOPCacheを使用してリクエストされたファイルをOpcodesに変換した経験があるかと思います。

その言葉の中で、リクエストされた時に変換されるというのはOpcodesに変換されるのに時間がかかるとのことです。

7.4 バージョンではプリローディングを利用し、サーバーが起動されるときに特定の PHP ファイルセットをメモリーにロードすることで返還にかかる時間をなくすことができます。

問題は、一回プリローディングされたファイル変更の追跡ができないことです。

プリローディングされたファイルに変更がある場合、サーバーを再起動する必要があります。

8. 新しいカスタムオブジェクト直列化(Serialization)方法

オブジェクトを直列化する方法として__sleep()マジックファンクション、__wakeup()マジックファンクション、
Serializableインタフェースを使用する3つの方法があったが、そこには問題がありました。

7.4バージョンではこれを解決するため、__serialize()__unserialize()マジックファンクションを追加しました。

class A {
    private $prop_a;
    public function __serialize(): array {
        return ["prop_a" => $this->prop_a];
    }
    public function __unserialize(array $data) {
        $this->prop_a = $data["prop_a"];
    }
}
class B extends A {
    private $prop_b;
    public function __serialize(): array {
        return [
            "prop_b" => $this->prop_b,
            "parent_data" => parent::__serialize(),
        ];
    }
    public function __unserialize(array $data) {
        parent::__unserialize($data["parent_data"]);
        $this->prop_b = $data["prop_b"];
    }
}

9. Foreign Function Interface: FFI

PHPで C 関数を呼出する時・C データ構造にアクセスするライブラリーがロードできるようになりました。

速度改善の側面ではよいところがあると思いますが、個人的に使うことがあるかと思ったら、あまりないかも...との感想です。

$ffi = FFI::cdef(
    "int printf(const char *format, ...);",
    "libc.so.6");
$ffi->printf("Hello %s!\n", "world");

10. 数字リテラルセパレーター(Numeric Literal Separator)

PHP 7.4では数字を分けるためにUnderscoreを使用することが可能になりました。

6.674_083e-11; // float
299_792_458;   // decimal
0xCAFE_F00D;   // hexadecimal
0b0101_1111;   // binary

11. Reflection for references

なんと翻訳すればいいかわかりません。
翻訳するとしたら 参照値を反映するためのものくらいですか?

以前には2つの変数が同じ内容を参照しているかを確認する作業が結構重い作業でしたが、
PHP 7.4に導入されたReflection for referencesを使用すればコストを削減することが可能になりました。

12. mb_str_split() 함수 추가

str_split()関数は文字列を配列に変換します。

mb_str_split()は文字をchunks(大きいかたまり)でパーシングすることができます。

print_r(mb_str_split("победа", 2));

--EXPECT--

Array
(
    [0] => по
    [1] => бе
    [2] => да
)

13. パスワードハッシングレジストリ

password_algos()関数が追加され、登録済みのパスワードハッシングアルゴリズムのリストを確認することが可能になりました。

2019年度 Impact Awards 受賞者発表

ベストツール、ベストフレームワークおよびアプリケーション、ベスト開発者経験、PHPコントリビューター、PHP 関連の会社に対するアワードがありました。

それぞれComposer、Laravel/Symfoy、GitHub、Sara Golemon、Automatticが受賞しました。

2019年ワードプレスで人気のあった5つのポートグラフィーテーマー

WP関連内容はパスします。

ソーシャル戦略をアップグレードすることができる10個のワードプレスのFacebookプラグイン

WP関連内容はパスします。

チュートリアルおよびスキール

ワードプレスカレンダープラグインでコースのスケジュール・タイムテーブルを見せる方法

WP関連内容はパスします。

APIの速度改善のためLaravelでHTTPセッションを無効化する方法

API サーバーではセッションを利用して得られる利点がないし、セッション関連のファイルを探索するためにかなりのコストが必要です。

Laravelでセッションを無効かすることで簡単にAPIサーバーの性能を改善することが可能です。

app/Http/Kernel.phpファイルのprotected $middlewareGroupsから下記のミドルウェアを削除したら終わりです。

\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,

Laminasへのマイグレーションテスト

Zend FrameworkがLaminasという名に代わりました。

変更点が結構あり、マイグレーションが簡単ではないそうです。

このブログを参考し、マイグレーションをテストしてみるのがおすすめです。

動的分析を使って0個のドキュメントタイプからフルドキュメントタイプ宣言まで

PHPで引数とリターン値のタイプを宣言できるようになったのは多くの方々が知っていると思います。

ドキュメントを作成する為にいろんな方法を使ってきましたが、レガシーコードに対して手をつけることはやっぱり難しいですよね。

このブログではTypeCollector::collect($value, __METHOD__, 0)という関数を利用し、1〜4週間のデータ収集を通じ、引数とリターン値にタイプを追加することを提案しています。

タイプ追加をしないといけない状況で不具合を起こさずタイプ追加ができる一つのいい方法ではないかと思います。

あなたのReactをビルドしてみましょう

Reactを使ってない為、パスします。

マルウェアをもっと深く分析する:パート2

マルウェアがどんな方式で動作しているのか分析したブログです。

内容を理解した訳ではないですが、動作原理を少しわかった後気づいたことはだからネットからいろんなファイルをダウンロードするのが危ないんだということでした。

PHPのコードスタイルをコントロールしよう

コード品質を維持する為に使える3つのツールを紹介しました。

ECS、PHPStan、Psalmです。

実は現在僕は一人で作業しているので、今までコード品質・CIなどを全く考えてなかったです。

最近勉強会などを参加しながらコード品質に対して気づき、いろんなことを適用して見ようと思っているので、少しずつプロジェクトに導入することを考えています。

Unitテストから頑張ります。

※ 勉強しなきゃいけないところがが本当に多いですね。

ElasticsearchおよびKibanaを利用して開発環境のSymfonyログをビジュアル化する方法

Symfonyフレームワークを使っている方々にはいいブログかと思います。

Laravelアプリの新しいユーザーにウェルカムノーティフィケーション送信

laravel-welcome-notification ライブラリーを利用して新しいユーザーにウェルカムメールとパスワード再設定を送信する方法に対して書いています。

PHPでjQueryを利用し、複数のテキストボックスを自動完成させる

ユーザー経験を向上させる為のAjaxをどうやって利用するかに関するブログ。

最近はjQueryをしようしていない為、チェックだけしました。

アナウンスメント

  1. PHP 7.4.0RC6 リリース

  2. Symfony 5.0.0-RC1 リリース

  3. Symfony 4.4.0-RC1 リリース

  4. Laravel 6.5.1 リリース

  5. ワードプレス 5.2.4 アップデート

おもしろいプロジェクト、ツール、ライブラリー

PHPWeeklyへ紹介されたプロジェクトリストです。

おもしろいと思ったら参加してもよいかと思います。

  1. scarlets: ウェブフレームワーク

  2. arrayy: 配列操作ライブラリー

  3. izend: コンテンツマネージングの為のMVCエンジン

  4. simple-cache: キャッシュサーバーと簡単にインターれくと可能なキャッシュレイヤー

  5. php-iban: 銀行アカウント情報の生成・パーシング・検証・エラーチェックのためのライブラリー

  6. gravity-pdf: メール、pdf ダウンロードフォームを作ってくれるワードプレスプラグイン

  7. pastebin-php: PHPで実装されたpastebin。何かよくわからない。

  8. generators: カスタムLaravelファイルジェネレーター

  9. sncredisbundle: SymfonyのためのRedisバンドル

  10. enhavo: Symfonyで作られたオープンソースCMS

  11. munus: PHPで関数型プログラミングをするためのライブラリー。

  12. slim4-skeleton: Slim4フレームワークのSkeleton。名前通り!

kimzzang
PHPer・韓国人 ブログのポストの中で、皆さんに共有したいものをQiitaに公開します。
https://medium.com/@kim.jangwook
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