gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

「出来た」んだが、どうも「やっていい」では無い気が山盛り…

原稿を書いていて、気づいて…且つ、ちょいと「まだ原稿には書けないなぁ」な内容だったので。
ネタは、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は俺も触れる!」って事ですねぇまいっちんぐ


…うんテストコードとかには便利そうなんだけど、実務でつかうと、割と物凄く簡単に「ヒドイ」事が出来そうで…嫌な予感しかぶっちゃけしないのですが。
これって「普通に実用だし便利だし危険性少ないよ」って使用例、なんかありますかねぇ?


いや「容易にヒドくなる」実装ならいくつか思いつくのですががが…