次のように、クラスのメソッド呼び出しをチェーンしたいと思います。
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')));
ブラケットの深さが少なくなり、間違いが少なくなり、これらの間違いを修正するために必要な時間が短くなり、さらにコードが読みやすくなり、私の意見では、コードの見栄えが良くなります。