ปัญหาเนมสเปซ PHP

ฉันกำลังพยายามใช้ไลบรารีภายนอก เนื่องจากมีข้อขัดแย้งบางประการ ฉันจึงใช้เนมสเปซ ( php 5.3 )

เป้าหมายไม่ใช่การเปลี่ยนไลบรารีภายนอกเลย (เพียงเพิ่มเนมสเปซที่ด้านบน)

ปัญหาอยู่ในห้องสมุดมีหลายสถานการณ์ที่ไม่ได้ผล

  • is_a($obj,'3thpartyclassname') ใช้งานได้เฉพาะเมื่อฉันเพิ่มเนมสเปซหน้าชื่อคลาสปาร์ตี้ที่ 3
  • บุคคลที่สามใช้คลาสเนทิฟ แต่จะไม่ทำงานเฉพาะเมื่อฉันใช้โกลบอลสเปซ (new \Exception)

มีวิธีใดที่จะทำให้สิ่งนี้ทำงานได้โดยไม่มีการดัดแปลงใด ๆ ?

อัปเดตการใช้ \Exception เป็นข้อยกเว้น; แก้ไขปัญหา 2

ฉันมีปัญหากับ is_a และ is_subclass_of เท่านั้น ทั้งสองต้องการเนมสเปซและละเว้นเนมสเปซปัจจุบัน


person johnlemon    schedule 17.03.2011    source แหล่งที่มา


คำตอบ (2)


ไม่ คุณต้องทำการปรับเปลี่ยนบางอย่าง

namespace My\Own\Namespace;                // declare your own namespace
use My\ThirdParty\Component;               // import 3rd party namespace
$component = new Component;                // create instance of it
var_dump(is_a($component, 'Component'));   // FALSE
var_dump($component instanceof Component); // TRUE

วิธีการ is_a และ is_subclass_of ต้องการให้คุณใส่ชื่อคลาสแบบเต็ม (รวมถึงเนมสเปซ) ตามความรู้ของฉัน ไม่มีทางแก้ไขได้ตั้งแต่ PHP 5.3.5 การใช้ instanceof ควรแก้ทั้งสองฐาน

การนำเข้าคลาสดั้งเดิม เช่น Exception ก็ควรใช้งานได้เช่นกัน เช่น

namespace My\Own\Namespace;
use \Exception as Exception;
throw new Exception('something broke');

ดูบทเกี่ยวกับ Namespace ในคู่มือ PHP สำหรับข้อมูลเพิ่มเติม

person Gordon    schedule 17.03.2011

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

person MightyE    schedule 17.03.2011