Magento 2 Object Manager Factoryを通じてクラスをインスタンス化します

magento.stackexchange https://magento.stackexchange.com//questions/34579

  •  12-12-2019
  •  | 
  •  

質問

Magento 2では、クラスはオブジェクトマネージャファクトリ:\Magento\Framework\ObjectManager\Factory\Factory::create()を使用してインスタンス化されています。
これまでのところGOO。しかし、私がここで理解していないことがあります。
DIのコンストラクターに渡されるべき引数に循環参照がないかどうかを確認した後、引数が決定された後にこれがある($argsはコンストラクタに渡されるべき引数です)。

    switch (count($args)) {
        case 1:
            return new $type($args[0]);
        case 2:
            return new $type($args[0], $args[1]);
        case 3:
            return new $type($args[0], $args[1], $args[2]);
        case 4:
            return new $type($args[0], $args[1], $args[2], $args[3]);
        case 5:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4]);
        case 6:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]);
        case 7:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6]);
        case 8:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7]);
        default:
            $reflection = new \ReflectionClass($type);
            return $reflection->newInstanceArgs($args);
    }
.

なぜこの長いswitchステートメントなのですか?defaultブランチからコードを直接使用しないのですか?
または、なぜcaseを8に停止しますか?5または10または127の?

役に立ちましたか?

解決

理由はパフォーマンスです。新規によるインスタンス化は反射よりわずかに速いです。ほとんどのクラスは8つ以下の引数を持っているので、このスイッチはほとんどの場合をカバーします。

削除されることがあります。

他のヒント

パフォーマンスゲインはほとんど見えません。2つのメソッドで1000000オブジェクトをインスタンス化しようとすると、ここに結果が次のとおりです。

href="https://i.stack.imgur.com/vor83.png" rel="nofollow noreferrer"> 画像の説明が入力されています

Magento 2 BetaとPHPのバージョンを使用しています(下記参照)

PHP 5.6.12-1 + Deb.Sury.org~ Trusty + 1(CLI)著作権(C)1997-2015 PHPグループZend Engine v2.6.0、著作権(C)1998-2015 Zend テクノロジー Zend Opcache v7.0.6-dev、著作権(C)1999-2015、Zend Technologies Xdebug v2.3.2、著作権(c)2002-2015、デリックレターン

このテストを行うために、私はこれを使用しました

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top