(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Bu SSS iki bölüme ayrılır: genel sorular ve isim alanlarını tamamen anlamaya yardımcı olacak gerçeklenime özgü ayrıntılar.
Önce genel sorularla başlıyoruz.
\bir\isim
veya \isim
gibi bir isim nasıl çözümlenir?bir\isim
gibi bir isim nasıl çözümlenir?isim
gibi bir nitelenmemiş sınıf ismi nasıl çözümlenir?isim
gibi bir nitelenmemiş işlev veya sabit ismi nasıl çözümlenir?İsim alanları gerçeklenimini tamamen anlamaya yardımcı olacak gerçeklenime özgü bir kaç ayrıntı vardır.
null
, true
veya false
sabitleri geçersiz kılınamaz.Hayır. Ne isim alanları mevcut koddan etkilenir ne de isim alanlarını içermeyen kodlar isim alanlarından etkilenir. İsterseniz kodu böyle yazabilirsiniz:
Örnek 1 - Küresel sınıflara bir isim alanı dışından erişim
<?php
$a = new \stdClass;
?>
Bu kod şuna eşdeğerdir:
Örnek 2 - Küresel sınıflara bir isim alanı dışından erişim
<?php
$a = new stdClass;
?>
Örnek 3 - İsim alanı içinden yerleşik sınıflara erişim
<?php
namespace fan;
$a = new \stdClass;
function test(\ArrayObject $bağımsız_değişken_türü_örneği = null) {}
$a = \DirectoryIterator::CURRENT_AS_FILEINFO;
// Bir yerleşik veya küresel sınıfın genişletilmesi
class MyException extends \Exception {}
?>
Örnek 4 - İsim alanındaki dahili sınıf, işlev ve sabitlere erişim
<?php
namespace fan;
class Sınıfım {}
// bağımsız değişken türü olarak geçerli isim alanındaki bir sınıfın kullanımı
function dnm(Sınıfım $bağımsız_değişken_türü_örneği = null) {}
// bağımsız değişken türü olarak geçerli isim alanındaki bir sınıfın başka
// bir yolla kullanımı
function dnm(\fan\Sınıfım $bağımsız_değişken_türü_örneği = null) {}
// geçerli isim alanındaki bir sınıfın genişletilmesi
class AltSınıfım extends Sınıfım {}
// bir küresel işleve erişim
$a = \küreselişlev();
// bir küresel sabite erişim
$b = \INI_ALL;
?>
\bir\isim
veya \isim
gibi bir isim nasıl çözümlenir?\
ile başlayan isimler daima yazıldıkları gibi çözümlenirler, bu bakımdan \bir\isim
aslında bir\isim
'dir; \Exception
da aslında Exception
'dır.
Örnek 5 - Tamamen nitelenmiş isimler
<?php
namespace fan;
$a = new \bir\isim(); // "bir\isim" sınıfını örnekler
echo \strlen('hi'); // "strlen" işlevini çağırır
$a = \INI_ALL; // $a değişkenine "INI_ALL" sabitinin değeri atanır
?>
bir\isim
gibi bir isim nasıl çözümlenir? Bir tersbölü içeren, ancak tersbölü ile başlamayan bir\isim
gibi isimler iki farklı yolla çözümlenebilir.
bir
ismini başka bir isimle ithal eden bir deyim varsa bu takma isim bir\isim
içindeki bir
'e uygulanır.
Aksi takdirde, bir\isim
isminin önüne geçerli isim alanı adı getirilir.
Örnek 6 - Nitelenmiş isimler
<?php
namespace fon;
use fan\fin as fon;
$a = new bir\isim(); // "fon\bir\isim" sınıfını örnekler
fon\bar::isim(); // "fan\fin\bar" sınıfının "isim" statik yöntemi çağrılır
bir\bar(); // "fon\bir\bar" işlevi çağrılır
$a = bir\BAR; // $a değişkenine "fon\bir\BAR" sabitinin değeri atanır
?>
isim
gibi bir nitelenmemiş sınıf ismi nasıl çözümlenir?isim
gibi tersbölü içermeyen sınıf isimleri 2 farklı yolla çözümlenebilir.
isim
ismini başka bir isimle ithal eden bir deyim varsa bu takma isim isim
'e uygulanır.
Aksi takdirde, isim
ismininin önüne geçerli isim alanı getirilir.
Örnek 7 - Nitelenmemiş sınıf isimleri
<?php
namespace fon;
use fan\fin as fon;
$a = new isim(); // "fon\isim" sınıfı örneklenir
fon::isim(); // "fan\fin" sınıfının "isim" statik yöntemi çağrılır
?>
isim
gibi bir nitelenmemiş işlev veya sabit ismi nasıl çözümlenir?isim
gibi tersbölü içermeyen işlev ve sabit isimleri 2 farklı yolla çözümlenebilir.
Önce isim
isminin önüne geçerli isim alanı ismi getirilir.
Son olarak, eğer isim alanında isim
diye bir işlev veya sabit yoksa ve isim
diye bir küresel işlev veya sabit varsa küresel alandaki kullanılır.
Örnek 8 - Nitelenmemiş işlev veya sabit isimleri
<?php
namespace fon;
use fan\fin as fon;
const FON = 1;
function bir() {}
function fon() {}
function sort(&$a)
{
\sort($a); küresel "sort" işlevi çağrılıyor
$a = array_flip($a);
return $a;
}
bir(); // "fon\bir" çarılır
$a = strlen('hi'); // "fon\strlen" mevcut olmadığından küresel
Aşağıdaki iki betik birlikte kurallara uygundur:
dosya1.php
<?php
namespace bir\isim;
class Sınıfım {}
?>
dosya2.php
<?php
namespace diğer;
class BirŞey {}
?>
dosya.php
<?php
namespace bir\isim;
include 'dosya1.php';
include 'dosya2.php';
use diğer\BirŞey as Sınıfım;
$a = new Sınıfım; // "diğer" isim alanındaki "BirŞey" sınıfını örnekler
?>
Sınıfım
sınıfı bir\isim
isim alanında mevcut olduğu halde Sınıfım
ayrı bir dosyada tanımlandığından herhangi bir isim çakışması olmaz. Ancak, sonraki örnekte, Sınıfım
sınıfı use
deyimi ile aynı dosyada tanımlandığından isim çakışmasından dolayı ölümcül hata oluşur.
<?php
namespace bir\isim;
use diğer\BirŞey as Sınıfım;
class Sınıfım {} // ölümcül hata: Sınıfım ithal edilen sınıfla çakışır
$a = new Sınıfım;
?>
PHP isim alanlarının böyle iç içe tanımlanmasına izin vermez:
<?php
namespace bir\isim {
namespace içiçe {
class fan {}
}
}
?>
<?php
namespace bir\isim\içiçe {
class fan {}
}
?>
Tersbölü imi dizgelerin içinde bir önceleme karakteri olarak kullanıldığından çift tırnaklar arasına alınmış bir dizge içindeki bir tersbölü karakterinin tersbölü ile öncelenmesi gerekir. Aksi takdirde, istenmeyen durumlar ortaya çıkabilir:
Örnek 9 - İsim alanlı isimleri çift tırnaklar arasında kullanmak tehlikelidir
<?php
$a = "tehlikeli\nesne"; // \n, çift tırnaklı dizge içinde
FAN
gibi nitelenmemiş olarak tanımsız sabitlere rastlandığında PHP, bunun FAN
değerli bir sabit varsayıldığını belirten bir uyarı üretecektir. İster nitelenmiş olsun ister tamamen nitelenmiş olsun tanımsız bir sabit daima ölümcül hataya sebep olur.
Örnek 10 - Tanımsız sabitler
<?php
namespace bar;
$a = FAN; // uyarı üretir - "FAN" sabit olarak tanımsız olduğundan