Không gian tên PHP và "sử dụng"


120

Tôi đang gặp một chút rắc rối với không gian tên và các usecâu lệnh.

Tôi có ba tác phẩm: ShapeInterface.php, Shape.phpCircle.php.

Tôi đang cố gắng thực hiện việc này bằng cách sử dụng các đường dẫn tương đối nên tôi đã đặt điều này vào tất cả các lớp:

namespace Shape; 

Trong lớp vòng kết nối của tôi, tôi có những thứ sau:

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 includebáo cáo, tôi không gặp lỗi. Nếu tôi thử các usetuyên bố tôi nhận được:

Lỗi nghiêm trọng: Không tìm thấy lớp 'Shape \ Shape' trong /Users/shawn/Documents/work/sites/workspace/shape/Circle.php trên dòng 8

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


Cũng liên quan đến chủ đề này - stackoverflow.com/questions/33341955/...
Peter

Câu trả lời:


169

Các usenhà điều hành là đã cho bí danh cho các tên của các lớp, giao diện hay không gian tên khác. Hầu hết các usecâu lệnh đề cập đến 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 usetoán tử được sử dụng với một lớp hoặc tên giao diện, nó có các cô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à useđiều hành không được nhầm lẫn với tự động tải . Một lớp được tự động tải (phủ định sự cần thiết include) bằng cách đăng ký một trình tải tự động (ví dụ: với spl_autoload_register). Bạn có thể muốn đọc PSR-4 để xem triển khai trình tải tự động phù hợp.


Vì vậy, nếu tôi tạo một tệp khác có tên bootstrap.php và đặt một trình tải tự động bên trong cùng với $ circle = new Circle (); Nó bao gồm Circle.php nhưng tôi gặp lỗi: Lỗi nghiêm trọng: Không tìm thấy lớp 'Shape' trong ... / Circle.php trên dòng 6. Dường như tải Circle.php nhưng không tải Shape.php Hình tròn được xác định như: lớp Circle mở rộng Hình dạng thực hiện ShapeInterface
Shawn Northrop

Nếu tôi xóa không gian tên khỏi các lớp trên, trình tải 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 gặp lỗi ở trên
Shawn Northrop

1
Đã tạo một ý chính để đưa ra một ví dụ. Thật không may, gists không thể có thư mục con. Đặt bootstrap.php vào một thư mục và đặt các lớp khác vào một thư mục con có tên là 'Shape'.
cmbuckley

13

Nếu bạn cần sắp xếp mã của mình vào không gian tên, chỉ cần sử dụng từ khóa namespace:

file1.php

namespace foo\bar;

Trong file2.php

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

Bạn cũng có thể sử dụng use. Nếu trong file2 bạn đặt

use foo\bar as mypath;

bạn cần sử dụng mypaththay vì barbất kỳ đâu trong tệp:

$obj  = new mypath\myObj();

Sử dụng use foo\bar;là bằng use foo\bar as bar;.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.