2012-05-10 8 views
82

İsim alanlarında ve use ifadelerinde sorun yaşıyorum.PHP ad alanları ve "use"

Üç dosyam var: ShapeInterface.php, Shape.php ve Circle.php. Benim daire sınıfta

namespace Shape; 

aşağıdakilere sahip

:

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

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

class Circle extends Shape implements ShapeInterface{ .... 

kullandığım takdirde bu ben sınıfların tümünde bu koyduk böylece göreli yolları kullanarak yapmaya çalışıyorum

include ifadeleri hata alıyorum. Ben use ifadeleri çalışırsanız alıyorum:

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

birisi bana bu konuda biraz rehberlik verir misiniz?

+0

Bunu okuyup hala oldukça alamadım eşittir use foo\bar dediğine olsaydı. Harici dosyalar kullanıma dahil edilir mi? –

+0

Ayrıca bu konuyla ilgili - http: // stackoverflow.com/questions/33341955/import-or-use-order-effect-function-in-php – Peter

cevap

124

use operator, sınıfların, arabirimlerin veya diğer ad alanlarının adlarına diğer adlar vermek içindir. Çoğu use deyimleri kısaltmak için istediğiniz bir ad veya sınıf bakın: use operatör sınıf veya arayüz adı ile kullanılırsa

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

, sahip olduğu:

use My\Full\Namespace; 

eşdeğerdir aşağıdaki kullanımlar:

// 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 operatör autoloading ile karıştırılmamalıdır değildir. Bir otomatik yükleyiciyi (örneğin spl_autoload_register ile) kaydederek bir sınıf otomatik yüklenir (include için gerekliliği reddeder). Uygun bir otomatik yükleyici uygulaması görmek için PSR-4'u okumak isteyebilirsiniz. Sadece anahtar kelime namespace kullanmak, ad alanlarına kodunuzu sipariş etmek gerekirse

+0

Harika, Bunu kontrol et. Teşekkürler! –

+0

Öyleyse bootstrap.php adlı başka bir dosya oluşturursam ve $ auto = new Circle(); Bu Circle.php içerir, ancak bir hata alıyorum: Önemli hata: Sınıf 'Şekil' içinde bulunamadı .../Circle.php satır 6'da. Circle.php dosyasını yükler, ancak yüklenmez Shape.php Circle tanımlanır. olarak: daire Çember uzatır Şekil uygular ShapeInterface –

+0

Yukarıdaki sınıflardan ad alanını kaldırırsam, otomatik yükleyici düzgün çalışır. Ancak, şekil sınıfının arabiriminde ad alanı olduğunda, bir örnek vermek için yukarıdaki hata –

4

en basit yolu onu

koymak. use anahtar kelime -


Hala

bu hikayeye biraz daha file2.php $obj = new foo\bar\myObj(); yılında file1.php namespace foo\bar;

yılında

.

Dosya2 use foo\bar as mypath içinde diyorsanız, dosyanın herhangi bir yerinde foo\bar yerine mypath kullanmanız gerekir. '

$obj = new mypath\myObj(); 

o use foo\bar as bar