オブジェクトマネージャーファクトリーを介したMagento 2のインスタンス化クラス


9

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ブランチのコードを直接使用しないのはなぜですか?
または、なぜcase8時に停止しますか?なぜ5または10または127ではないのですか?


非常にベッドのコーディング
Keyul Shah

1
@KeyulShah。かもしれませんが、これには理由があると私はほぼ確信しています。
マリウス

回答:


11

理由はパフォーマンスです。新規によるインスタンス化は、リフレクションよりもわずかに高速です。ほとんどのクラスには8個未満の引数があるため、このスイッチはほとんどの場合に対応します。

おそらく削除されるでしょう。


1
答えてくれてありがとう。私は少しがっかりしていると言わざるを得ません。ファンシーなものを期待していた。:)
マリウス

1
パフォーマンスは十分な理由ではありませんか?:)
アントンクリ

3
また、答えが明確でない場合は、頻繁に発生するもの(つまり、オブジェクトのインスタンス化)のやや高速な実装が価値があります。
アランストーム

1
@AntonKril。私はその理由について話していませんでした。「こうやってやるから、ビールが温まることはない」みたいなかっこいい答えを期待していた。しかし、今のところ「パフォーマンス」でそれができると思います。近くにいてください。他の哲学的質問は翌日に続きます。:)
マリウス

6

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

ここに画像の説明を入力してください

Magento 2ベータ版とPHPバージョンを使用しています(以下を参照)

PHP 5.6.12-1 + deb.sury.org〜trusty + 1(cli)Copyright(c)1997-2015 PHP Group Zend Engine v2.6.0、Copyright(c)1998-2015 Zend Technologies with Zend OPcache v7.0.6 -dev、Copyright(c)1999-2015、Zend Technologies with Xdebug v2.3.2、Copyright(c)2002-2015、by Derick Rethans

このテストを行うために、このスクリプトを使用しました


うーん...アントンは「少し速い」と述べた。それは:)です。しかしとにかく...プロファイリングのために+1。
マリウス

このコードはずっと前に追加されました。それはPHP 5.3でテストされました。それ以降のバージョンでは違いがあまり目立たなくなったため、このコードは後で削除される可能性があると私の回答で述べました。
Anton Kril

@AntonKril代わりに、最大15個のパラメーターをポンプしましたか?;-)
Fabian Schmengler 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.