はちゅにっき

こっちのブログはまったり更新

PHP で Mixin したい!

「アナタに Mixin されたい」とかタイトル書こうとしたけれど、なんか変な連想されそうだったので却下。


PHP って Ruby と同じで多重継承ができないけれど、Ruby とは違って Mixin の機能がないので、適当に繕ってみようかなー。
という動機で作ってみました。
あとは、get_class_vars( ) とかを使って、プロパティにもアクセスできるようにすればいい感じ?
とか思っていたら、似たような構造で Mixin 機能を作っている方がたくさんいらっしゃったので、ひっそりと折りたたみ。


で、実際に使ってみたら、使い方がいろいろあって、いったい何を作ったのか分からなくなりました。

  • 継承してクラスをつくる
<?php
class MixinClass extends Mixin

    function __construct ( )
    {
        parent::__construct( array('Class1', 'Class2', 'Class3') );

        /* 以下のようにもかけます
         * parent::__construct( array(
         *     new Class1( ),
         *     new Class2($foo, $bar),
         *     new Class3($hoge, $fuga, $puge),
         * ) );
        */
    }
}

これで、MixinClass から Class{1, 2, 3} の function が呼び出せるようになります。(本来目的としていた機能)

  • そもそも Mixin クラスを new してしまう
<?php
$obj = new Mixin( array(
    new Class1($args),
    new Class2($args),
    new Class3($args),
) );

こうすると、$obj が Class{1, 2, 3} の機能を持ったオブジェクトとして利用できる。(予定外)
こうなることは当然といえば当然だけれども、なんか「予定外の使い方の方が使い勝手が良い」というジレンマに陥ったんですけど。


えーっと、とりあえず。。。わーい。