RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Readonly Propertyって?PHPerのためのPHP8.1をもっと語り合う【PHP TechCafe イベントレポート】

f:id:tech-rakus:20220324144520p:plain

弊社で毎月開催しているPHPエンジニアのための勉強会『PHP TechCafe』。
2021年12月に開催されたPHP Tech Cafeでは、
「PHPerのためのPHP8.1をもっと語り合う」をテーマにして語り合いました。
今回はその内容について@neroblubrosがレポートします!

rakus.connpass.com

PHP TechCafeとは

本題に入る前に「PHP TechCafe」について軽く説明します。
PHP TechCafe」とは弊社が主催しているエンジニア向けのイベントで、
エンジニアと技術が交差する憩いの場(カフェ)です。

月に1回開催し、コロナ禍の現在はオンラインで開催しています。
対象者はPHP入門の初級エンジニアからシニアエンジニアを幅広くカバーし、
学びの場を提供してエキスパートまでの自己成長を支援することを目的にしています。

PHP TechCafe」は以下の3部構成です(日によって変わることもあります)。

  • ライトニングトーク(LT)
  • PHPer's NEWS
  • 特集

2021年12月は前述の通り「PHPerのためのPHP8.1をもっと語り合う」をテーマに開催いたしました。
その中でも特集の「PHP8.1の機能について」語り合った内容のポイントや盛り上がったテーマを中心にレポートします!

PHP8.1の機能について語り合う

今回は公式サイトのPHP8.1リリース情報を見ながら語り合いました。

www.php.net

Enumerations

まずはPHP 8.1の目玉機能であるEnumです。

<?php

// PHP < 8.1
class Status
{
    const DRAFT = 'draft';
    const PUBLISHED = 'published';
    const ARCHIVED = 'archived';
}
function acceptStatus(string $status) {...}

//PHP 8.1
enum Status
{
    case Draft;
    case Published;
    case Archived;
}
function acceptStatus(Status $status) {...}

PHP TechCafe」では過去に何度も話題になっている機能ですが、改めて次のような意見が挙がりました。

  • 昔はこうしていたんだよという対比が面白いですね。
  • JavaEnumの亜種みたいな感じですね。

Readonly Properties

一度だけ値を代入できるという機能です。
弊社はベトナムでオフショア開発をしているため、弊社のメンバーからは次のような意見があがりました。

「ロケーションの違いやコミュニケーションロスにより、設計の意図を超えた実装になってしまうことがあります。そういうときに言語仕様で制限をかけるというのは有効だと思うので、このような仕組みはどんどん取り入れていきたいです。」

また、

「PropertyがPublicになり、かつ変更できないのが利点であり、いちいちgetterを定義しなくても良いし、書き換えられる不安もなく安心できる。コードの量が減るので可読性が上がる。」

とのメリットを社外の方からご説明いただきました。

First-class Callable Syntax

もともと無名関数を書いてその中で呼出とリターンを行っていたものが、この機能を使うことでコードをすっきりさせられます。

<?php

// PHP < 8.1
$foo = [$this, 'foo'];

$fn = Closure::fromCallable('strlen');

// PHP 8.1
$foo = $this->foo(...);

$fn = strlen(...);

以下のような意見が出ました。

  • コードがすっきりさせられるけど慣れるまで時間がかかりそう
  • ......$の違いを理解しておかないと混乱する
  • 部分的には似ているけど全然違う構文っていうのがわかりにくい

version_compare

文字通りバージョンの比較をするときに使う構文です。
例えば、1.0.01.1.0の比較をするときに、ドットで分割して数値に置き換えて比較する必要がなくなります。

<?php

if (version_compare($version, '14.3.1') >= 0) {
    //14.3.1以上の処理
} else {
   //14.3.1未満の処理
}

参加者からは「ニーズがあるのか?」という疑問の声が挙がりましたが、
ライブラリを提供しているときやAPIのクライアントの比較をするときに使っているそうです。

Never return type

「呼び出し元に返らない」ことを明示的に記載できるようになった機能です。
exitやリダイレクトなどで呼び出し元に戻ることがないことを示します。

<?php

function redirect():never{
    //リダイレクト処理
    exit;
}

参加者から「関数を呼び出した後に処理があり、そのコードが実行されると思っていたら、
先に呼び出している関数から処理が返ってこなかった、という経験があるので、
そういうときに never と記載されていると助かる。」という意見が挙がりました。

Explicit Octal numeral notation

8進数の記載方法の変更です。
8進数はいままでは 016 と記載していましたが、 0o16 と書くようになりました。

桁をそろえるためにあえて「0」を記載していたと思って、
削除したら実は8進数でしたということで、エラーになるという不慮の事故を防止するためです。

非推奨となる機能

次の機能が非推奨になります。

  • 日の出・日の入関数の date_sunrise()date_sunset()
  • オブジェクトに対して key()current()next()prev()reset() を呼び出すこと

「今は非推奨だけれども、そのうち使えなくなるので今のうちに消しておく意図だろう。」
という結論になりました。

また、php.iniの設定で $_GET$_POST$_COOKIE$_REQUEST$_SERVER のデータをフィルタリングすることができていましたが、デフォルト設定である unsafe_raw 以外は全て非推奨となる予定です。

php.iniの設定で処理を行うと一見すると便利に見えるけれど、プログラムではなく暗黙的に値を書き換えることになるので、後でコードを読んでも設定箇所がわからず、調査が難しくなる。」
という議論が交わされました。

余談ですが、
php.iniの設定で href のリンクに対して PHPSESSIONID を付与することができ、それはガラケー向けサイトを作るときに便利でした。」
という紹介がされ、一同「なるほど~」という声が挙がりました。

また、精度が落ちるfloatからintへの暗黙の変換も非推奨となります。

<?php

$a = [];
$a[15.5]  //非推奨
$a[15.0]  //これは15となるのでOK

非推奨となるのは良いけれど、15.015 とみなされOKになるのは「ツラい」という意見が挙がりました。

挙げればキリがないのでレポートは以上といたしますが、
外部の方から有益な情報をご提供いただき、今回も有意義なTech Cafeとなりました。
以下レポートの編集後記です。

編集後記

前述の通り外部のエンジニアの方も参加され、社内では知り得ない詳しい情報を得ることで理解が深めることができました。
また、どんなことでもぱっと経緯や実例を挙げて説明いただいたので、その引き出しの多さや瞬発力の凄さに感服いたしました。

また、当該レポートとは別に以前のTech Cafeの関連記事を載せておきますので、
合わせて読んでみてください。

tech-blog.rakus.co.jp

tech-blog.rakus.co.jp

PHP TechCafe」では今後もPHPに関する様々なテーマのイベントを企画していきます。
皆さまのご参加をお待ちしております。

connpass.com


  • エンジニア中途採用サイト
    ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
    ご興味ありましたら是非ご確認をお願いします。
    20210916153018
    https://career-recruit.rakus.co.jp/career_engineer/

  • カジュアル面談お申込みフォーム
    どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
    以下フォームよりお申込みください。
    rakus.hubspotpagebuilder.com

  • イベント情報
    会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.