İsim alanlarının kullanımı: İthal/Rumuz

(PHP 5 >= 5.3.0, PHP 7)

Dış kaynaklı tamamen nitelenmiş bir isme bir takma adla veya ithal ederek başvurma yeteneği isim alanlarının önemli bir özelliğidir. Bu özellik, Unix dosya sistemlerinin bir dizin veya dosyaya bir sembolik bağ oluşturma yeteneğine benzer.

İsim alanlarını destekleyen tüm PHP sürümleri üç çeşit takma ad kullanımını veya ithalini destekler: bir sınıf adına takma ad, bir arayüz adına takma ad ve bir isim alanı adına takma ad. PHP 5.6+ ayrıca, bir işlev veya sabit isminde de ithali ve takma ad kullanımını destekler.

PHP'da takma ad kullanımı use işleci üzerinden sağlanır. Aşağıda 5 çeşit ithal örneğine yer verilmiştir:

Örnek 1 - use işleci ile ithal/rumuz kullanımı

<?php
namespace fan;
use 
Bir\Tam\Sınıfadı as BirBaşkası;

// use Bir\Tam\iAadı as iAadı ile aynıdır
use Bir\Tam\iAadı;

// küresel bir sınıfın ithali
use DiziNesnesi;

// bir işlevin ithali (PHP 5.6+)
use function Bir\Tam\işlevAdı;

// bir işleve takma ad (PHP 5.6+)
use function Bir\Tam\işlevAdı as func;

// bir sabitin ithali (PHP 5.6+)
use const Bir\Tam\SABİT;

$nesne = new namespace\BirBaşkası// fan\BirBaşkası sınıfını örnekler
$nesne = new BirBaşkası// Bir\Tam\Sınıfadı  sınıfını örnekler
iAadı\altia\işlev(); // Bir\Tam\iAadı\altia\işlev işlevini çağırır
$a = new DiziNesnesi(array(1)); // DiziNesnesi sınıfını örnekler
// "use DiziNesnesi" olmasaydı fan\DiziNesnesi sınıfını örneklerdik
func(); // Bir\Tam\işlevAdı işlevini çağırır
echo SABİT// Bir\Tam\SABİT değerini basar
?>
İsim alanlı adlar için baştaki terbölü gereksiz olup önerilmediği gibi bunlar geçerli isim alanına göre işlenmezler. İthal edilen isimler ise tamamen nitelenmiş olmalıdır. (Tamamen nitelenmiş isimler Fan\Fin şeklinde isim alanı ayracı içermelerine karşın küresel isimler FanFin şeklinde isim alanı ayracı içermezler.)

PHP bunlara ek olarak çok sayıda use deyiminin aynı satırda kullanılmasına imkan veren bir kısayola da sahiptir.

Örnek 2 - use işleci ile rumuz/ithal, çoklu use kullanımı

<?php
use Bir\Tam\Sınıfadı as BirBaşkasıBir\Tam\iAadı;

$nesne = new BirBaşkası// Bir\Tam\Sınıfadı sınıfını örnekler
iAadı\altia\işlev();     // Bir\Tam\iAadı\altia\işlev işlevini çağırır
?>

İthal işlemi derleme sırasında yerine getirilir ve dolayısıyla devingen sınıf, işlev ve sabit isimlerini etkilemez.

Örnek 3 - İthal işlemi ve devingen isimler

<?php
use Bir\Tam\Sınıfadı as BirBaşkasıBir\Tam\iAadı;

$nesne = new BirBaşkası// Bir\Tam\Sınıfadı sınıfını örnekler
$a 'BirBaşkası';
$nesne = new $a;         // BirBaşkası sınıfını örnekler
?>

Bunlara ek olarak, ithal işlemi sadece nitelenmemiş ve nitelenmiş isimleri etkiler. Tamamen nitelenmiş isimler mutlak olup ithal işleminden etkilenmez.

Örnek 4 - İthal işlemi ve tamamen nitelenmiş isimler

<?php
use Bir\Tam\Sınıfadı as BirBaşkasıBir\Tam\iAadı;

$nesne = new BirBaşkası;       // Bir\Tam\Sınıfadı sınıfını örnekler
$nesne = new \BirBaşkası;        // BirBaşkası sınıfını örnekler
$nesne = new BirBaşkası\birşey;  // Bir\Tam\Sınıfadı\birşey sınıfını örnekler
$nesne = new \BirBaşkası\birşey// BirBaşkası\birşey sınıfını örnekler
?>

İthal etki alanı kuralları

use anahtar sözcüğü bir dosyanın en dış etki alanında veya isim alanı bildirimleri içinde kullanılmalıdır. Bunun sebebi ithal işleminin çalışma zamanında değil derleme sırasında yapılmasıdır, dolayısıyla bir bloğun etki alanında olamaz. Aşağıdaki örnekte uygun olmayan use kullanımı gösterilmiştir:

Örnek 5 - Usülsüz ithal kuralı

<?php
namespace Languages;

function 
toGreenlandic()
{
    use 
Languages\Danish;

    
// ...
}
?>

Bilginize:

İthal kuralları dosyaya özeldir, yani içerilen dosyalar içeren dosyanın ithal kurallarını miras alMAyacaktır.

Gruplu use bildirimleri

PHP 7.0 ve sonrasında, aynı isim alanından ithal edilen sınıflar, işlevler ve sabitler tek bir use deyiminde gruplanabilir.

<?php

// PHP 7 öncesi
use some\namespace\ClassA;
use 
some\namespace\ClassB;
use 
some\namespace\ClassC as C;

use function 
some\namespace\fn_a;
use function 
some\namespace\fn_b;
use function 
some\namespace\fn_c;

use const 
some\namespace\ConstA;
use const 
some\namespace\ConstB;
use const 
some\namespace\ConstC;

// PHP 7 sonrası
use some\namespace\{ClassAClassBClassC as C};
use function 
some\namespace\{fn_afn_bfn_c};
use const 
some\namespace\{ConstAConstBConstC};