原稿を書いていて、気づいて…且つ、ちょいと「まだ原稿には書けないなぁ」な内容だったので。
ネタは、PHPの、クロージャ(無名関数)周り。
bindっちゅ〜メソッドがあるのですが。
「バインドされたオブジェクトとクラスのスコープでクロージャを複製する」の意味がどうもよく分からなくて(今から考えると「怖くて理解したくなかった」ような気もする…)、調べて…嫌ンな気付きにたどり着きましたとさどっとはらい。
class hoge { // private $a_; } // $func = function($obj) { $obj->a_ = 100; }; $obj = new hoge(); $func($obj); var_dump($obj);
でエラーが出るのは当たり前というか出なきゃ困るよまいっちんぐ、なのですが。
が。
が。
class hoge { // private $a_; } // $func = function($obj) { $obj->a_ = 100; }; $obj = new hoge(); $func2 = $func->bindTo(NULL, 'hoge'); $func2($obj); var_dump($obj);
ってやると「privateなプロパティに触れる」んですねぇまいっちんぐ。
「バインドされたオブジェクトとクラスのスコープでクロージャを複製する」なのでつまり「クラス hogeでバインディングしたから、クラス hogeのスコープで動くから、クラス hogeのprivateは俺も触れる!」って事ですねぇまいっちんぐ。
…うんテストコードとかには便利そうなんだけど、実務でつかうと、割と物凄く簡単に「ヒドイ」事が出来そうで…嫌な予感しかぶっちゃけしないのですが。
これって「普通に実用だし便利だし危険性少ないよ」って使用例、なんかありますかねぇ?
いや「容易にヒドくなる」実装ならいくつか思いつくのですががが…