PHP ad alanları ve "kullanım"


120

Ad alanlarıyla ilgili biraz sorun yaşıyorum ve use ifadelerle ilgili .

Ben üç dosya vardır: ShapeInterface.php, Shape.phpveCircle.php .

Bunu göreceli yolları kullanarak yapmaya çalışıyorum, bu yüzden bunu tüm sınıflara koydum:

namespace Shape; 

Çevre sınıfımda aşağıdakilere sahibim:

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

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

class Circle extends Shape implements ShapeInterface{ ....

includeİfadeleri kullanırsam hata almam. Aldığım useifadeleri denersem:

Önemli hata: 'Shape \ Shape' Sınıfı, 8. satırda /Users/shawn/Documents/work/sites/workspace/shape/Circle.php içinde bulunamadı

Birisi bana bu konuda biraz rehberlik edebilir mi?


Bu konuyla ilgili olarak ayrıca - stackoverflow.com/questions/33341955/…
Peter

Yanıtlar:


169

useOperatör sınıflar, arayüzler veya diğer ad adlarının adlar vererek içindir. Çoğu useifade, kısaltmak istediğiniz bir ad alanına veya sınıfa atıfta bulunur:

use My\Full\Namespace;

eşdeğerdir:

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

Eğer useoperatör bir sınıf veya arabirim adı ile kullanıldığında, aşağıdaki amaçlarla kullanılabilir:

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

useOperatör ile karıştırılmamalıdır değildir hakklı . Bir sınıf, includebir otomatik yükleyiciyi (örn spl_autoload_register. Uygun bir otomatik yükleyici uygulamasını görmek için PSR-4'ü okumak isteyebilirsiniz .


Öyleyse, bootstrap.php adında başka bir dosya oluşturursam ve içine bir otomatik yükleyici yerleştirirsem, $ circle = new Circle (); Circle.php içeriyor ama bir hata alıyorum: Ölümcül hata: 6. satırda ... / Circle.php içinde 'Shape' sınıfı bulunamadı. Circle.php yüklüyor gibi görünüyor, ancak Shape.php yüklenmiyor Circle tanımlı as: class Circle, Shape'i genişletir, ShapeInterface'i uygular
Shawn Northrop

Yukarıdaki sınıflardan ad alanını kaldırırsam, otomatik yükleyici iyi çalışır. Bununla birlikte, şekil sınıfının arayüzünde ad alanım olduğunda yukarıdaki hatayı alıyorum
Shawn Northrop

1
Örnek vermek için bir özet oluşturdu. Maalesef esasların alt klasörleri olamaz. Bootstrap.php dosyasını bir klasöre koyun ve diğer sınıfları 'Shape' adlı bir alt klasöre koyun.
cmbuckley

13

Kodunuzu ad alanlarına göre sıralamanız gerekiyorsa, anahtar kelimeyi kullanmanız yeterlidir namespace:

file1.php

namespace foo\bar;

File2.php içinde

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

Ayrıca kullanabilirsiniz use. Dosya2'de ise

use foo\bar as mypath;

dosyanın herhangi bir yeri mypathyerine kullanmanız gerekir bar:

$obj  = new mypath\myObj();

Kullanmak use foo\bar;eşittir use foo\bar as bar;.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.