Namespace PHP dan "gunakan"


120

Saya mengalami sedikit masalah dengan ruang nama dan usepernyataan.

Saya memiliki tiga file: ShapeInterface.php, Shape.phpdan Circle.php.

Saya mencoba melakukan ini menggunakan jalur relatif jadi saya telah meletakkan ini di semua kelas:

namespace Shape; 

Di kelas lingkaran saya, saya memiliki yang berikut:

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

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

class Circle extends Shape implements ShapeInterface{ ....

Jika saya menggunakan includepernyataan, saya tidak mendapatkan kesalahan. Jika saya mencoba usepernyataan yang saya dapatkan:

Kesalahan fatal: Kelas 'Bentuk \ Bentuk' tidak ditemukan di /Users/shawn/Documents/work/sites/workspace/shape/Circle.php di baris 8

Bisakah seseorang memberi saya sedikit panduan tentang masalah ini?


Jawaban:


169

The useOperator adalah untuk memberikan alias untuk nama-nama kelas, interface atau ruang nama lainnya. Sebagian besar usepernyataan merujuk ke namespace atau kelas yang ingin Anda persingkat:

use My\Full\Namespace;

setara dengan:

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

Jika useoperator digunakan dengan kelas atau nama antarmuka, ia memiliki kegunaan berikut:

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

The useoperator tidak harus bingung dengan autoloading . Sebuah kelas dimuat secara otomatis (meniadakan kebutuhan untuk include) dengan mendaftarkan sebuah pemuat otomatis (misalnya dengan spl_autoload_register). Anda mungkin ingin membaca PSR-4 untuk melihat implementasi autoloader yang sesuai.


Jadi jika saya membuat file lain bernama bootstrap.php dan menempatkan autoloader di dalamnya bersama dengan $ circle = new Circle (); Ini termasuk Circle.php tapi saya mendapatkan error: Fatal error: Class 'Shape' tidak ditemukan di ... / Circle.php pada baris 6. Tampaknya memuat Circle.php tetapi tidak memuat Shape.php Circle didefinisikan sebagai: class Circle extends Shape mengimplementasikan ShapeInterface
— Shawn Northrop

Jika saya menghapus namespace dari kelas di atas, autoloader berfungsi dengan baik. Namun ketika saya memiliki namespace di antarmuka kelas bentuk saya mendapatkan kesalahan di atas
— Shawn Northrop

1
Menciptakan inti untuk memberi contoh. Sayangnya inti tidak bisa memiliki subfolder. Letakkan bootstrap.php di folder dan tempatkan kelas lainnya di subfolder bernama 'Shape'.
— cmbuckley

13

Jika Anda perlu mengurutkan kode Anda ke dalam namespace, cukup gunakan kata kunci namespace:

file1.php

namespace foo\bar;

Di file2.php

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

Anda juga bisa menggunakan use. Jika di file2 Anda masukkan

use foo\bar as mypath;

Anda perlu menggunakan mypathalih-alih bardi mana pun dalam file:

$obj  = new mypath\myObj();

Menggunakan use foo\bar;sama dengan use foo\bar as bar;.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.