เนมสเปซ PHP และ "ใช้"


120

ฉันมีปัญหาเล็กน้อยกับเนมสเปซและuseข้อความ

ฉันมีสามไฟล์: ShapeInterface.php, Shape.phpและCircle.php.

ฉันกำลังพยายามทำสิ่งนี้โดยใช้เส้นทางสัมพัทธ์ดังนั้นฉันจึงใส่สิ่งนี้ไว้ในทุกชั้นเรียน:

namespace Shape; 

ในคลาสวงกลมของฉันฉันมีสิ่งต่อไปนี้:

namespace Shape;
//use Shape;
//use ShapeInterface;

include 'Shape.php';
include 'ShapeInterface.php';    

class Circle extends Shape implements ShapeInterface{ ....

หากฉันใช้includeงบฉันไม่พบข้อผิดพลาด ถ้าฉันลองใช้useข้อความที่ฉันได้รับ:

ข้อผิดพลาดร้ายแรง: ไม่พบคลาส 'Shape \ Shape' ใน /Users/shawn/Documents/work/sites/workspace/shape/Circle.php ในบรรทัดที่ 8

ใครช่วยกรุณาให้คำแนะนำเล็กน้อยเกี่ยวกับปัญหานี้


เกี่ยวกับเรื่องนี้ด้วย - stackoverflow.com/questions/33341955/…
ปีเตอร์

คำตอบ:


169

ตัวuseดำเนินการมีไว้สำหรับกำหนดนามแฝงให้กับชื่อของคลาสอินเทอร์เฟซหรือเนมสเปซอื่น ๆ useข้อความส่วนใหญ่อ้างถึงเนมสเปซหรือคลาสที่คุณต้องการย่อ:

use My\Full\Namespace;

เทียบเท่ากับ:

use My\Full\Namespace as Namespace;
// Namespace\Foo is now shorthand for My\Full\Namespace\Foo

หากใช้useตัวดำเนินการกับคลาสหรือชื่ออินเทอร์เฟซจะมีการใช้งานดังต่อไปนี้:

// after this, "new DifferentName();" would instantiate a My\Full\Classname
use My\Full\Classname as DifferentName;

// global class - making "new ArrayObject()" and "new \ArrayObject()" equivalent
use ArrayObject;

useผู้ประกอบการจะไม่ให้สับสนกับautoloading คลาสถูกโหลดอัตโนมัติ (ไม่จำเป็นต้องใช้include) โดยการลงทะเบียนตัวโหลดอัตโนมัติ (เช่นกับspl_autoload_register) คุณอาจต้องการอ่านPSR-4เพื่อดูการใช้งานตัวโหลดอัตโนมัติที่เหมาะสม


ดังนั้นถ้าฉันสร้างไฟล์อื่นชื่อ bootstrap.php และวางตัวโหลดอัตโนมัติไว้ข้างในพร้อมกับ $ circle = new Circle (); มันมี Circle.php แต่ฉันได้รับข้อผิดพลาด: ข้อผิดพลาดร้ายแรง: ไม่พบคลาส 'Shape' ใน ... / Circle.php ในบรรทัดที่ 6 ดูเหมือนว่าจะโหลด Circle.php แต่ไม่โหลด Shape.php Circle ถูกกำหนด as: class Circle ขยาย Shape ใช้ ShapeInterface
Shawn Northrop

ถ้าฉันลบเนมสเปซออกจากคลาสด้านบนตัวโหลดอัตโนมัติจะทำงานได้ดี อย่างไรก็ตามเมื่อฉันมีเนมสเปซในอินเทอร์เฟซของคลาสรูปร่างฉันได้รับข้อผิดพลาดข้างต้น
Shawn Northrop

1
สร้างส่วนสำคัญเพื่อเป็นตัวอย่าง น่าเสียดายที่ส่วนสำคัญไม่สามารถมีโฟลเดอร์ย่อยได้ ใส่ bootstrap.php ในโฟลเดอร์และใส่คลาสอื่น ๆ ในโฟลเดอร์ย่อยชื่อ 'Shape'
cmbuckley

13

หากคุณต้องการสั่งซื้อรหัสของคุณในเนมสเปซให้ใช้คีย์เวิร์ดnamespace:

file1.php

namespace foo\bar;

ใน file2.php

$obj = new \foo\bar\myObj();

useนอกจากนี้คุณยังสามารถใช้ ถ้าใน file2 คุณใส่

use foo\bar as mypath;

คุณต้องใช้mypathแทนที่barใดก็ได้ในไฟล์:

$obj  = new mypath\myObj();

ใช้use foo\bar;เท่ากับuse foo\bar as bar;.

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