ข้อดีและข้อเสียของ namespaces vs รวม / ต้องการใน PHP?


20

ฉันเพิ่งเริ่มใช้ namespaces ใน PHP เมื่อฉันเห็นพวกเขาครั้งแรกฉันคิดว่าไวยากรณ์ของพวกเขาน่าเกลียดและฉันจะไม่ใช้มัน อย่างไรก็ตามฉันสร้าง autoloader (spl_autoload_register) ที่สร้างขึ้นเพื่อที่ฉันจะได้ไม่ต้องเขียนคำสั่ง include / ต้องการอีกครั้ง

ฉันชอบเนมสเปซ แต่มีประโยชน์วัตถุประสงค์กว่ารวม / ต้องการงบหรือว่าพวกเขาเป็นวิธีเดียวกันเพื่อบรรลุเป้าหมายเดียวกันหรือไม่


1
เนมสเปซจะป้องกันการชนกับห้องสมุดของบุคคลที่สาม
Reactgular

1
ตอนนี้ประโยชน์หลักสำหรับฉันเกี่ยวกับ namespaces คือการโหลดอัตโนมัติ เช่นฉันใช้ in-line new \Vendor\Namespace\Class()โดยไม่ต้องมีคำสั่ง statement ก่อนหน้านี้ในเมธอดหรือคลาส
NobleUplift

3
ห้องสมุด PHP หลายแห่งใช้การโหลดอัตโนมัติโดยไม่มีเนมสเปซ PHP ควรทำให้ namespaces บังคับ
Reactgular

ไม่มีข้อโต้แย้งจากฉัน ผมต้องการที่จะเห็นการเปลี่ยนแปลงทั้งหมดเหล่านี้ไว้ที่นี่
NobleUplift

คำตอบ:


21

Namespaces ไม่ได้มีไว้สำหรับคลาสการโหลดอัตโนมัติเท่านั้น พวกเขายังป้องกันความขัดแย้งในการตั้งชื่อ ในความเป็นจริงนั่นคือจุดประสงค์หลักของพวกเขา

สมมติว่าคุณมีโครงการที่ต้องการคลาสที่มีชื่อUserเพื่อจัดเก็บข้อมูลเกี่ยวกับผู้ใช้แอปพลิเคชันของคุณ แต่ปลั๊กอินยังใช้คลาส (ต่างกัน) ที่มีชื่อUserเพื่อจัดเก็บข้อมูล เนมสเปซให้คุณสร้างคลาสของคุณภายในหนึ่งเนมสเปซ (พูดMyApp) และให้ปลั๊กอินใช้เนมสเปซอื่น (พูดCoolPlugin) โค้ดภายในMyAppช่องว่างสามารถอ้างถึงได้User(เช่น, new User();), และดังนั้นจึงสามารถโค้ดในCoolPluginช่องว่าง; แต่ละคนจะได้รับผลลัพธ์ที่คาดหวัง เมื่อคุณต้องการใช้รหัสจากเนมสเปซอื่นคุณเพียง แต่นำหน้ามัน ตัวอย่างเช่นรหัสในCoolPluginช่องว่างสามารถเข้าถึงUserชั้นเรียนMyAppผ่านทางnew \MyApp\User();

ทางเลือกคือว่าชั้นทุกความต้องการชื่อที่ซับซ้อนได้ทุกที่เช่นและclass MyApp_User class CoolPlugin_Userเนมสเปซให้คุณลดความซับซ้อนของสิ่งต่าง ๆ ได้ตลอดเวลาและหลีกเลี่ยงการตั้งชื่อที่ขัดแย้งกันตลอดเวลา

แก้ไข:เพื่อตอบคำถาม "มีความแตกต่างระหว่างประสิทธิภาพทั้งสองหรือไม่"

ไม่ใช่คนที่มีความหมาย ฉันไม่ได้ทำการเปรียบเทียบ แต่อาจมีความแตกต่างในระดับนาโนวินาที ที่กล่าวว่าการเสียสละคุณภาพของรหัสสำหรับการปรับแต่งประสิทธิภาพขนาดเล็กพิเศษนั้นไม่ใช่กลยุทธ์ที่ดีดังนั้นคุณควรใช้เนมสเปซโดยไม่คำนึงถึง สำหรับมาตรฐานของชนิดที่คล้ายกันของปัญหาดูPHPbench.comและคำตอบนี้ StackOverflow

รหัสของคุณจะต้องเหลือเชื่อแน่นและไม่น่าเชื่อเวลาที่สำคัญ (คิดว่าการซื้อขายความถี่สูงหรือการจัดการปฏิกิริยานิวเคลียร์) ก่อนที่คุณจำเป็นต้องกังวลเกี่ยวกับไมโครเพิ่มประสิทธิภาพในชนิดของบริบทนี้ ถ้ามันจริงๆคือเวลาที่สำคัญที่คุณควรอาจจะเขียนโปรแกรมในหรือแม้กระทั่งไม่ตีความภาษาเช่น PHP


1
+1 ฉันเพิ่งทราบว่าทุกโครงการเริ่มดูเหมือนว่ามันอาจไม่จำเป็นต้องมีเนมสเปซและจากนั้นก็เติบโตได้อย่างง่ายดายจนถึงจุดที่มันไร้สาระที่จะแฮ็กสิ่งต่างๆ การไม่มีเนมสเปซนั้นเหมือนกับการประกาศตัวแปรทั่วโลกเช่นเดียวกับที่ใช้กับคลาส บนฐานรหัสขนาดใหญ่ขึ้นหรือกลุ่มที่ใช้ไลบรารีอย่างเสรีมันจะกลายเป็นเรื่องยุ่งเหยิงไปหมด
BrianH

1
โปรดดูการแก้ไขของฉันด้านบน
elixenide

2
ฉันพูดถึงว่าฉันกำลังสร้างอินเทอร์เฟซ PHP สำหรับ Large Hadron Collider หรือไม่? มิฉะนั้นฉันเชื่อว่าคำตอบนี้เพียงพอขอบคุณ
NobleUplift

1
โปรดอย่าสร้างดาวควาร์กหรือหลุมดำ! ดีใจที่ได้ช่วยเหลือ
elixenide

1
ไม่ต้องกังวลนัก strangelets เท่านั้น เรากำลังสร้างปืนใหญ่ฮาดรอน - ฉันหมายถึงมีบางอย่างที่ไม่น่าเชื่อและไม่มีอาวุธ
NobleUplift
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.