Engineering

PHP: 新機能 - Manual (PHP 5.6.x から PHP 7.0.x への移行)

上記ページの「Null 合体演算子」の項を読んでみる。
$username = $_GET['user'] ?? 'nobody';
// 上のコードは、次のコードと同じ意味です。
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

$baz = 3;
$qux = 4;
echo $foo ?? $bar ?? $baz ?? $qux; // 出力は 3 です

めっちゃ便利やんけっ!

実はこの記事を下書き保存して半月以上経過したのだが、いまだ使用機会ナシ。
だって、例えば
$bar = false;
$baz = 3;
$qux = 4;
var_dump($foo ?? $bar ?? $baz ?? $qux); // 出力は bool(false) です

のように、falseと評価される値が入っていた場合の扱いが、希望にそぐわなかった。
こんな感じで「エラー制御演算子」と併せて「三項演算子の短縮形」を使用しましたとさ。
$bar = false;
$baz = 3;
$qux = 4;
var_dump(@$foo ?: @$bar ?: @$baz ?: @$qux); // 出力は int(3)です


「三項演算子の短縮形」には新しい名前をつけてあげなかったんだね。
まあ、『三項演算子を短縮したもの』だからねぇ。
「Null 合体演算子」のほうはそんな表現ができない、新しい演算だから、新しい名前が必要だった、ということか。


ところで、次の項にある「宇宙船演算子」って。。
「spaceship operator」の和訳なんだねー。
<=> この形が宇宙船に見えたんだろうねー。
カッコいいねー。
でも括弧じゃないねー。不等号だねー。

…なんだこの記事(-_-;)
ああ、ちょっとメモのつもりが、壮絶な蛇足を生んでしまった。。

簡潔にまとめます。

ストライプテスト環境で支払いテスト時に「ワンクリックチェックアウト」を使用したいけど、認証コードってどうするの?
という話。

結論は、おそらく適当に入力すればなんでも通る。
私の場合は全部ゼロ、000000で通りました。

これ、もしかして、適当でも良いってことは、携帯番号も適当で良かったということか。
機会があったら試してみよう。

--
さて、ここから蛇足の始まりです…。

続きを読む
ログを取るため、データベースにオブジェクトをserializeして格納した。

テスト用のプログラムでデータベースから取り出したものを読み込んで、unserializeした。

おー、ちゃんと復元できとるやん!
ん?待てよ。なんか中途半端に復元してないか?
元のプログラムで、serializeしたものをその場でunserializeして表示してみたら、ちゃんと復元できる。

※ここから間違い
あー、データベースに格納する時、テキスト型で格納したからうまくいかなかったのか!
※あとから思えば、もしそうだったらunserializeがエラーになるはずやろ。。。

よーし、blob型にしてもう一度挑戦だ!

やっぱりダメだ(T_T)

復元したものを改めてよく見ると、なんか「__PHP_Incomplete_Class」なるクラスのインスタンスとして復元されとるやん。

それググれ!
うーん、なんか、unserializeの前にインクルードしましょう、的なヤツしかヒットせぇへん。
わしが欲しいんは、データベースに格納したら壊れるゆう話なんや!
※狂っとる(-_-;)

数十分格闘後、
あれ?そういえばクラス定義されてなくない?
そら復元できるわけあらへんやろがな…orz

その後、composer関連でのミスもあってすんなりいかなかったが、結局、、、
ググって出てきた『unserializeの前にインクルードしましょう、的なヤツ』が正解でしたやん。。。

PEBCAKは続くよどこまでも………………
(鬱の呼吸壱の型三点リーダー六連!)
phpのglob関数の落とし穴 : 備忘録」より
パス名に [ が入っていると正常に動作しません。
ソースは http://php.net/manual/ja/function.glob.php#86425


上記々事よりわかること。
・エスケープしたい文字を角括弧([])で囲む
・角括弧自信をエスケープしたい場合も同様
・なので…角括弧開く([)をエスケープしたければ '[[]' と書く
・ちなみに、角括弧開くをエスケープすれば閉じるのほうはエスケープ不要

例を示すと、「角括弧で囲まれた日付(yymmdd形式)を持つファイルの検索」したい場合、
$filenames = glob('*[[][0-9][0-9][0-9][0-9][0-9][0-9]]*');

こんな感じ。
テーブル定義の際に必要になったので調べた。

FAQ | LINE Developers」より
ユーザーIDの値は、U[0-9a-f]{32}の正規表現にマッチする文字列になります。

よって、レコード上は32桁にしてアプリケーション側で頭に「U」を付けて処理するか、そのまま33桁保存するか、ですね。
リソースの限られた昔なら前者一択だったんだろうけど、今どきそんな事気にしない、むしろ処理速度の低下を気にする…かな(-_-;)?

↓おまけ
グループIDの値はC[0-9a-f]{32}、トークルームIDの値はR[0-9a-f]{32}の正規表現にマッチする文字列になります。

あれ?グループなのに「G」じゃなくて「C」なのか…。
おそらく他ですでに使用していたから、なんだろうけど、パッと見でGだと思っちゃううっかりさんを生みそうな予感がするなぁ…
それ、未来のワ・タ・シσ(゚∀゚ ;)?


参考記事:LINEのユーザーIDの桁数 なんでもブログ
(記事中のリンクが切れていて調べ直した)