13

次のように、クラスのメソッド呼び出しをチェーンしたいと思います。

new Obj($args, $if, $any)->foo()->bar();

残念ながら、構造を括弧で囲む必要があります:

(new Obj($args, $if, $any))->foo()->bar();

だから私は私が次のようなことをしたいすべてのクラスで再利用できる特性を持ちたいです:

Obj::create($args, $if, $any)->foo()->bar();

私のクラスが他のクラスから継承できるように、それをトレイトにしたいと思います。私はその点に到達しました:

trait Create
{
    public static final function create()
    {
        $reflect = new ReflectionClass(/* self ? static ? Anything else ? */);
        return $reflect->newInstanceArgs(func_get_args());
    }
}

class Obj
{
    use Create;

    // ...
}

しかし、トレイトは自己または静的キーワードを処理しないようですget_class($this)。これは静的であるため、私は処理できません。私がやりたいことをする明確な方法はありますか?

読んでくれてありがとう。

編集:疑問に思う人のために、これが私がそれを抽象的な基本クラスではなく特性にしたい理由です:

$database = (new Database())
    ->addTable((new Table())
        ->addColumn((new Column('id', 'int'))
            ->setAttribute('primary', true)
            ->setAttribute('unsigned', true)
            ->setAttribute('auto_increment', true))
        ->addColumn(new Column('login', 'varchar'))
        ->addColumn(new Column('password', 'varchar')));

$database = Database::create()
    ->addTable(Table::create()
        ->addColumn(Column::create('id', 'int')
            ->setAttribute('primary', true)
            ->setAttribute('unsigned', true)
            ->setAttribute('auto_increment', true))
        ->addColumn(Column::create('login', 'varchar'))
        ->addColumn(Column::create('password', 'varchar')));

ブラケットの深さが少なくなり、間違いが少なくなり、これらの間違いを修正するために必要な時間が短くなり、さらにコードが読みやすくなり、私の意見では、コードの見栄えが良くなります。

4

3 に答える 3

12

はい、ありget_called_class()ます。これはまさにあなたが望むことを行います。

于 2013-03-15T23:05:48.580 に答える
0

角かっこを使用したくない理由がわかりません。これは、世界で最悪の構文ではありません(実際、視覚的な観点からは、置き換えたい二重コロン構文よりも優れていると思います。と)

しかし、すべてのクラスにこのようなファクトリメソッドを設定したい場合は、createメソッドを定義する他のすべてのクラスから拡張する基本クラスを作成してみませんか?私はあなたがそれのために特性を必要としているとは思わない。

class BaseClass {
    public function create() {
        ...
    }
}

そして、extends BaseClassまだ持っていない他のすべてのクラスextends

于 2013-03-15T23:15:37.210 に答える
-2

特性はPHPの新機能です。この機能はバージョン5.4で導入されました。これはPHPの多重継承の代わりです

例:

trait Net
{
    public function net()
    {
        return 'Net';
    }
}

trait Tuts
{
    public function tuts()
    {
        return 'Tuts';
    }
}

class NetTuts
{
    use Net, Tuts;
    public function plus()
    {
        return 'Plus';
    }
}

$o = new NetTuts;
echo $o->net(), $o->tuts(), $o->plus();

出力は:NetTutsPlus

echo (new NetTuts)->net(), (new NetTuts)->tuts(), (new NetTuts)->plus();

出力は:NetTutsPlus

オブジェクト$oの助けを借りて、特性関数の値にアクセスできます。

于 2014-07-19T16:24:50.040 に答える