Magento 2 สร้างอินสแตนซ์คลาสผ่านทางผู้จัดการวัตถุ


9

ในวีโอไอพี 2 \Magento\Framework\ObjectManager\Factory\Factory::create()ชั้นเรียนที่มีการใช้อินสแตนซ์โรงงานผู้จัดการวัตถุ:
จนถึงตอนนี้สารที่หนา แต่มีบางอย่างที่ฉันไม่เข้าใจที่นี่
หลังจากตรวจสอบว่าไม่มีการอ้างอิงแบบวงกลมในอาร์กิวเมนต์ที่ควรถูกส่งผ่านไปยัง Constructor สำหรับ DI และหลังจากที่อาร์กิวเมนต์ถูกกำหนดแล้วจะมีสิ่งนี้ ( $argsเป็นอาร์กิวเมนต์ที่ควรถูกส่งผ่านไปยัง Constructor):

    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


การเข้ารหัสเตียงมาก
Keyul Shah

1
@KeyulShah อาจเป็นได้ แต่ฉันเกือบจะแน่ใจว่ามีเหตุผลที่อยู่เบื้องหลังนี้
Marius

คำตอบ:


11

เหตุผลก็คือประสิทธิภาพ การสร้างอินสแตนซ์ผ่านใหม่นั้นเร็วกว่าการสะท้อนเล็กน้อย คลาสส่วนใหญ่มีอาร์กิวเมนต์น้อยกว่า 8 ข้อดังนั้นสวิตช์นี้จึงครอบคลุมกรณีส่วนใหญ่

บางทีมันอาจจะถูกลบออกไป


1
ขอบคุณสำหรับคำตอบ. ฉันต้องบอกว่าฉันผิดหวังเล็กน้อย ฉันคาดหวังบางสิ่งที่แฟนซี :)
Marius

1
ประสิทธิภาพไม่ดีพอเหตุผล? :)
Anton Kril

3
นอกจากนี้ในกรณีที่ยังไม่ชัดเจนจากคำตอบการใช้งานได้เร็วขึ้นเล็กน้อยในบางสิ่งที่เกิดขึ้นมากมาย (เช่นการทำให้วัตถุเป็นวัตถุ) นั้นคุ้มค่า
Alan Storm

1
@AntonKril ฉันไม่ได้พูดถึงเหตุผล ฉันหวังว่าจะได้คำตอบแฟนซีเช่น "เพราะเราทำอย่างนี้เบียร์ของคุณจะไม่อบอุ่น" หรืออะไรทำนองนั้น แต่ฉันเดาว่า "ประสิทธิภาพ" จะทำได้ในตอนนี้ กรุณาอยู่ใกล้ ๆ คำถามเชิงปรัชญาอื่น ๆ จะตามมาในวันถัดไป :)
Marius

6

ประสิทธิภาพที่เพิ่มขึ้นนั้นแทบจะมองไม่เห็น เมื่อฉันพยายามที่จะยกตัวอย่างวัตถุ 1000000 ด้วย 2 วิธีนี่คือผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันใช้ 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 โดย Derick Rethans

เพื่อทำการทดสอบนี้ฉันใช้สคริปต์นี้


ดี ... แอนตันพูดว่า "เร็วขึ้นเล็กน้อย" ซึ่งมันคือ :) แต่อย่างไรก็ตาม ... +1 สำหรับการทำโปรไฟล์
Marius

รหัสนี้ถูกเพิ่มมานานแล้ว มีการทดสอบกับ PHP 5.3 ในรุ่นที่ใหม่กว่าจะเห็นความแตกต่างน้อยลงนั่นคือสาเหตุที่ฉันพูดถึงคำตอบของฉันว่ารหัสนี้อาจถูกลบในภายหลัง
Anton Kril

@AntonKril คุณเปลี่ยนพารามิเตอร์ได้มากถึง15 พารามิเตอร์ใช่ไหม ;-)
Fabian Schmengler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.