General

プラグイン周りの仕様

2008年2月9日

現在のところ、コアではほとんどのコードでクラスのスタティックメソッドを利用するため、あまりオブジェクト指向とはいえないコードになっている。

一方で、プラグインの部分は、オブジェクト経由でアクセスする予定。理由は、次のとおり。

Nucleusと同じく、プラグインはすべてpluginクラスを継承したクラスとして記述することになる。プラグインのクラスをスタティックなメソッドの集合体として扱った場合、複数のプラグインのクラスが単一のpluginクラスを継承しているため、親クラスであるpluginクラスのそれぞれのメソッドで、各プラグインに固有の値(プラグインオプションなど)を処理できないのである。

一方で、Nucleusがやっているようにすべてオブジェクト経由で扱った場合、pluginクラスのメソッドでは$thisオブジェクトを経由することでこれを行うことができる(他方、コアの各クラスは、複数のインスタンスを持たせる必要が無いため、スタティックなメソッドやプロパティを扱うやり方で、今のところコードに混乱は無い)。

プラグインの仕様については、Nucleusのプラグインとほぼ同一のものを提供する予定である。が、もともとこのプロジェクトをはじめた動機のひとつとして、プラグインを書くときに楽をしたいというのもあるので、そうなるような仕様の変更を考えている。

現在のところ、どんなことで楽ができるかというと、

1)sql_table() 関数を使う必要が無い。
2)global $manager, $CONF, $DIR_LIBS; といった記述が不要。
3)echo htmlspecialchars($text,ENT_QUOTE,_CHARSET); の代わりに core::p($text); で良い。
4)3と同様だが、クエリーでaddslashes()やmysql_escape_string()なども使う必要が無い。

など。

PHP5ではデストラクタが使えるので、これを利用すれば、プラグインオプション周りの記述を簡略化することができそう。例えば、

$this->options->foo="New Value";

で『foo』と言う名のプラグインオプションに新しい値を入れるようにする。もちろん、

$value=$this->options->foo;

とすれば、現在の値を取得できる。ブログオプションなら、

$value=$this->blogoption($blogid)->foo;
$this->blogoption($blogid)->foo="New Value";

といった感じで。変更されたプラグインオプションは、デストラクタで、データベースに書き込みを行う。

あと、PHP5ではイテレータをいじることができるので、これで何かできないかを考えたい。また、別の機会にメモ。

参考テストコード:
<html><body><pre><?php

error_reporting(E_ALL);
$t=new test1;
echo $t->test1()->test2();
echo '<br>';
echo $t->test12->test2();

class test1{
    private $obj;
    public $test12;
    public function __construct(){
        $this->obj=new test2;
        $this->test12=new test2;
    }
    public function test1(){
        return $this->obj;
    }
}

class test2{
    public function test2(){
        return 'test2() OK';
    }
}

?></pre></body></html>

実行結果:
test2() OK
test2() OK

デストラクタのテストコード:
<html><body><pre><?php

$t=new jp_test;

class plugin {
    public final function __destruct(){
        $this->dest();
        echo "destruct plugin<br>\n";
    }
}

class jp_test extends plugin {
    public function dest(){
        echo "destruct jp_test<br>\n";
    }
}


?></pre></body></html>

実行結果:
destruct jp_test
destruct plugin

コメント

コメントはありません

コメント送信