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.