だいぶ前にこんな記事を書いていましたけど、
どうやら PHP 7.4 では zend.exception_ignore_args
なるオプションが増えたらしく幻想ではなくなったようです。
PHP 7.3 以前では SplFileObject
のインスタンスが bar
で発生した例外に掴まれて main
まで飛んでいくので foo
のスコープを抜けてもファイルは閉じられませんでした。
しかし PHP 7.4 で zend.exception_ignore_args
を有効にしておけば例外によって関数の引数が掴まれることがないので、bar
で発生した例外に SplFileObject
のインスタンスが掴まれることはなく、foo
のスコープを抜ければファイルは閉じられます。
以前社内で、例外がログられるときにスタックトレースの引数にセンシティブな情報があるとやばいのでそのたぐいの情報はリクエストから取り出した直後にオブジェクトか何かでラップした方が良いのだろうか、とか話題になったんですけど(このとき)、それもこれで一緒に解決できるということですね(むしろそっちが zend.exception_ignore_args
の本来の目的ですね)。
PHP 7.3 以前だと #0 /in/F9nc9(9): f('ore no himitu')
のように引数が出力されてしまってますけど、PHP 7.4 で zend.exception_ignore_args
が有効なら #0 /in/F9nc9(9): f()
のように引数は現れません。