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?

Shawn Northrop
sumber
Juga tentang subjek ini - stackoverflow.com/questions/33341955/…
Peter

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.

cmbuckley.dll
sumber
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;.

Charlie
sumber