객체 관리자 팩토리를 통해 클래스를 인스턴스화하는 Magento 2


9

magento 2에서 클래스는 객체 관리자 팩토리를 사용하여 인스턴스화됩니다 \Magento\Framework\ObjectManager\Factory\Factory::create().
지금까지 끈적 거리다. 그러나 내가 이해하지 못하는 것이 있습니다.
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. 그럴 수도 있지만, 이것 뒤에 이유가 있다고 확신합니다.
Marius

답변:


11

그 이유는 성능입니다. 새로운 것을 통한 인스턴스화는 반사보다 약간 빠릅니다. 대부분의 클래스에는 8 개 미만의 인수가 있으므로이 스위치는 대부분의 경우를 다룹니다.

아마도 제거 될 것입니다.


1
답변 해주셔서 감사합니다. 나는 조금 실망했다고 말해야한다. 나는 뭔가 멋진 것을 기대하고 있었다. :)
Marius

1
성능이 충분하지 않은 이유는 무엇입니까? :)
Anton Kril

3
또한 대답에서 명확하지 않은 경우 많은 일이 발생하는 (예 : 객체 인스턴스화) 약간 더 빠른 구현이 가치가 있습니다.
Alan Storm

1
@AntonKril. 나는 그 이유에 대해 이야기하지 않았습니다. 나는 "우리가 이런 식으로 맥주를 마시면 절대 따뜻하지 않을 것"과 같은 멋진 답변을 기대하고있었습니다. 그러나 나는 "성능"이 지금 그것을 할 것이라고 생각합니다. 제발 가까이있어 다른 철학적 질문은 다음 날에 따를 것이다. :)
Marius

6

성능 향상은 거의 보이지 않습니다. 2 개의 메소드를 사용하여 1000000 개의 객체를 인스턴스화하려고하면 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

Magento 2 Beta 및 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, Xdebug v2.3.2, Copyright (c) 2002-2015, Derick Rethans

이 테스트를하기 위해이 스크립트를 사용했습니다


음 ... 앤톤은 "약간 빠르다"고 말했다. 그것은 :)입니다. 그러나 어쨌든 ... + 1 프로파일 링.
Marius

이 코드는 오래 전에 추가되었습니다. PHP 5.3에서 테스트되었습니다. 이후 버전에서 차이점이 눈에 띄지 않게되었습니다.이 답변에서 나중에이 코드가 제거 될 수 있다고 언급했습니다.
Anton Kril

@AntonKril 대신 최대 15 개의 매개 변수 를 펌핑 했습니까? ;-)
Fabian Schmengler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.