ฉันจะเพิ่มการกำหนดเนมสเปซ PHP ในไลบรารีบางส่วนโดยไม่ทำให้รหัสที่มีอยู่เสียหายได้อย่างไร


10

บริษัท ของฉันสร้างกรอบ PHP แบบแยกส่วนในช่วงหลายปีที่ผ่านมาเริ่มต้นนานก่อนที่ PHP จะเพิ่มเนมสเปซ 5.3 เมื่อเร็ว ๆ นี้เราตัดสินใจที่จะเริ่มใช้เนมสเปซในรหัสใหม่ของห้องสมุด อย่างไรก็ตามเรามีปัญหาเล็ก ๆ น้อย ๆ ที่เราพยายามหาว่าการเพิ่มเนมสเปซลงในโค้ดเบส pre-v5.3 นั้นไม่ใช่ความคิดที่ดีหรือไม่:

  1. ฉันสามารถเนมสเปซคลาส แต่ยังอิมพอร์ต (ใช้) โกลบอลเนมสเปซเพื่อให้คลาสโกลบอลทั้งหมดไม่ต้องการ\คำนำหน้าได้หรือไม่?
  2. หากเรากำหนดคลาสที่มีอยู่ในห้องสมุดของเราเราจะป้องกันไม่ให้โครงการที่มีอยู่ทั้งหมดแตกหักทันทีที่การอัพเกรดเฟรมเวิร์ก ตัวอย่างเช่นไลบรารีสามารถเปลี่ยนชื่อของคลาสThemeEngineเป็น\module\theme\ThemeEngineแต่เว็บไซต์ที่มีอยู่โทรออกThemeEngineโดยไม่มีการแก้ไขรหัสใด ๆ ถ้าเป็นเช่นนั้นรหัสนั้นจะเป็นอย่างไร

คำตอบ:


2
  1. คุณไม่สามารถ 'ใช้' namespaces ที่ทุกคนเศร้าเรียนเท่านั้น: http://www.php.net/manual/en/language.namespaces.importing.php แก้ไข: คุณสามารถนำเข้าคลาสจากเนมสเปซส่วนกลางได้เช่นเดียวกับที่ทำกับ ArrayObject ในหนึ่งในตัวอย่าง

  2. คุณสามารถมีคำสั่งการใช้ทั่วโลกเพื่อให้คลาสที่มีอยู่แล้วทั้งหมดซึ่งอยู่ในเนมสเปซส่วนกลางด้วยเช่นกันในทางทฤษฎีควรหาคลาสที่ใช้ได้ ในทางทฤษฎี ...

เราอยู่ในเรือลำเดียวกันกับคุณ เรามีรหัสเก่าที่ไม่ได้ใช้เนมสเปซ แต่ใช้ _ namespace faker (เช่น Zend_Db_Table ... ) และเรามีรหัสเก่าที่ไม่ใช้เนมสเปซปลอม เราอาจจะใช้เส้นทางเดียวกัน แต่เรายังต้องทดสอบว่าเป็นไปได้หรือไม่ โชคดี!


1

ใช่สิ่งที่ฉันทำในท้ายที่สุดคือการใช้ - 'ใช้' เพื่อนำเข้าแต่ละชั้นเรียนที่ฉันต้องการ

ตัวอย่างเช่นแทนที่จะเพิ่ม '/' ต่อหน้าทุกสิ่งเช่น:

\DateTime()

ฉันเพิ่มภายใต้เนมสเปซของฉัน

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.