2012-05-10 32 views
82

Tôi đang gặp một chút rắc rối với các không gian tên và các câu lệnh use.Các không gian tên PHP và "sử dụng"

Tôi có ba tệp: ShapeInterface.php, Shape.phpCircle.php.

tôi đang cố gắng để làm điều này sử dụng đường dẫn tương đối vì vậy tôi đã đặt điều này trong tất cả các lớp:

namespace Shape; 

Trong lớp vòng tròn của tôi, tôi đã điều sau đây:

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

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

class Circle extends Shape implements ShapeInterface{ .... 

Nếu tôi sử dụng các câu hỏi include Tôi không nhận được lỗi. Nếu tôi thử các tuyên bố use tôi nhận được:

Fatal error: Class 'Shape\Shape' not found in /Users/shawn/Documents/work/sites/workspace/shape/Circle.php on line 8

Ai đó có thể vui lòng cho tôi một chút hướng dẫn về vấn đề này?

+0

tôi đọc này và vẫn không hoàn toàn nhận được nó. Các tệp bên ngoài có được đưa vào sử dụng không? –

+0

Cũng liên quan đến chủ đề này - http: // stackoverflow.com/questions/33341955/does-the-nhập-hoặc-sử dụng-trật tự-ảnh hưởng-chức năng-in-php – Peter

Trả lời

124

use operator là để đặt bí danh cho tên lớp, giao diện hoặc các không gian tên khác. Hầu hết use báo cáo đề cập đến một không gian tên hoặc lớp mà bạn muốn rút ngắn:

use My\Full\Namespace; 

tương đương với:

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

Nếu các nhà điều hành use được sử dụng với một lớp hoặc giao diện tên, nó có những ứng dụng sau:

// 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; 

Nhà điều hành use không phải là để bị nhầm lẫn với autoloading. Một lớp được tự động tải (phủ nhận nhu cầu cho include) bằng cách đăng ký trình nạp tự động (ví dụ: spl_autoload_register). Bạn có thể muốn đọc PSR-4 để xem cài đặt trình nạp tự động phù hợp.

+0

Tuyệt vời, Ill kiểm tra xem. Cảm ơn! –

+0

Vì vậy, nếu tôi tạo một tập tin gọi là bootstrap.php và đặt một autoloader bên trong cùng với $ circle = new Circle(); Nó bao gồm các Circle.php nhưng tôi nhận được một lỗi: Lỗi nghiêm trọng: Class 'Shape' không tìm thấy trong .../Circle.php trên dòng 6. Nó xuất hiện để tải Circle.php nhưng không tải Shape.php Circle được định nghĩa như: class Circle extends Shape thực hiện ShapeInterface –

+0

Nếu tôi loại bỏ không gian tên từ các lớp trên, trình nạp tự động hoạt động tốt. Tuy nhiên khi tôi có không gian tên trong giao diện của lớp hình dạng tôi nhận được lỗi trên –

4

Cách đơn giản nhất để đặt nó

Nếu bạn cần đặt hàng mã của bạn trong không gian tên, chỉ cần sử dụng các từ khóa namespace.

Trong file1.php namespace foo\bar;

Trong file2.php $obj = new foo\bar\myObj();


Tuy nhiên nhiều hơn một chút để câu chuyện này - từ khóa use.

Nếu bạn nói trong tệp2 use foo\bar as mypath điều này có nghĩa là bạn cần sử dụng mypath thay vì foo\bar ở bất kỳ đâu trong tệp. '

$obj = new mypath\myObj(); 

Nếu bạn đã nói use foo\bar nó bằng use foo\bar as bar

Các vấn đề liên quan