PHP

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」の和訳なんだねー。
<=> この形が宇宙船に見えたんだろうねー。
カッコいいねー。
でも括弧じゃないねー。不等号だねー。

…なんだこの記事(-_-;)
ログを取るため、データベースにオブジェクトを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]]*');

こんな感じ。
/etc/php.ini を書き換えて httpd をリスタート!
…変わらない(´・ω・`)

いやー、参りましたよ。
ちょうどコマンドラインで呼び出したりしていたので、CLI版PHPではphp.iniの変更が反映されていたので、よりカオスな方向に行ってしまったのですわ。

もう、的はずれな検索語でググっては失敗の繰り返し。
そんな中でふと思い出したのです。
PHP-FPMの存在を。

以前にも同じよーな罠にハマったから、思い出したんだろうねー。

という訳で、php-fpmをリロードしたところ、当然変更が反映されましたとさ。

詳しくは下記の参考文献をご参照下さいませ〜

Apacheの再起動でphp.iniの設定が反映されなかった時 - suzu6の技術ブログ


そして、エラーログでもハマりましたとさ。
PHPのエラーログは(centos8のPHP-FPM環境の場合?)デフォルトで下記になってました。
/var/log/php-fpm/www-error.log

また、同じ罠にハマってた…orz
bootstrap4のpopoverはsanitizeオプションに気をつけろ

てか、↑の記事、結局どうすればいいか書いてないな(-_-;)
リンクも切れてるし(~_~;)
内容にも誤りがあるなぁ(@_@;)

という訳で、書き直そう。

sanitizeオプションは、contentやtitleなどで指定する内容から有害そうな内容を取り除くというオプション。デフォルトはtrueなので有効。なので、指定しないと<input>タグなどのフォーム部品の類は取り除かれてしまう、ということみたいでーす。

htmlオプションでHTMLを有効にして、その中にフォーム部品が含まれている場合は、《危険性を理解した上で》sanitizeオプションにfalseを指定しましょう。

というわけで、こんな感じ。
$(elem).popover({
content: 'お名前:<input type="text" name="name" />',
html: true,
sanitize: false
});