SSS: İsim alanları hakkında bilinmesi gerekenler
(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.
-
İsim alanlarını
kullanmayacak olsam bile bu konuyla yine de ilgilenmeli miyim?
-
Yerleşik ve
küresel sınıfları bir isim alanı içinde nasıl kullanabilirim?
-
İsim alanlarının
sınıflarını, işlevlerini ve sabitlerini kendi isim alanlarında nasıl
kullanabilirim?
-
\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.
-
İthal edilen isimler
aynı dosyada tanımlı sınıflarla çelişmemelidir.
-
İç içe isim alanlarına
izin verilmez.
-
Dinamik isim alanları
isimlerinin (tırnak içine alınmış betimleyiciler) içindeki
tersbölülerin öncelenmesi gerekir.
-
Tersbölü
kullanılarak atıf yapılan tanımsız sabitler ölümcül hataya sebep
olur.
-
Özel
null
, true
veya false
sabitleri geçersiz kılınamaz.
İsim alanlarını kullanmayacak olsam bile bu konuyla yine de
ilgilenmeli miyim?
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;
?>
Yerleşik ve küresel sınıfları bir isim alanı içinde nasıl
kullanabilirim?
Ö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 {}
?>
İsim alanlarının sınıflarını, işlevlerini ve sabitlerini kendi
isim alanlarında nasıl kullanabilirim?
Ö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
// "strlen" işlevi çağrılır
$arr = array(1,3,2);
$b = sort($arr); // "fon\sort" işlevi çağrılır
$c = fon(); // "fon\fon" işlevi çağrılır - ithal işlemi uygulanmaz
$a = FON; // $a değişkenine "fon\FON" sabitinin değeri
// atanır - ithal işlemi uygulanmaz
$b = INI_ALL; // $b değişkenine "INI_ALL" küresel sabitinin değeri atanır
?>
İthal edilen isimler aynı dosyada tanımlı sınıflarla
çelişmemelidir.
Aşağıdaki iki betik birlikte kurallara uygundur:
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.
İç içe isim alanlarına izin verilmez.
PHP isim alanlarının böyle iç içe tanımlanmasına izin vermez:
Bununla birlikte, isim alanlarını birbirinin içinde şöyle tanımlamak
mümkündür:
Dinamik isim alanları isimlerinin (tırnak içine alınmış
betimleyiciler) içindeki tersbölülerin öncelenmesi gerekir.
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
// satırsonu karakteridir!
$obj = new $a;
$a = 'bu\tamamen\tehlikesiz\nesne'; // burada sorun yok.
$obj = new $a;
?>
Tersbölüleri tek tırnakları arasına alınmış bir dizge içinde kullanmak
daha güvenli olsa da her iki dizge türünde de tersbölüleri öncelemek en
güvenlisidir.
Tersbölü kullanılarak atıf yapılan tanımsız sabitler ölümcül
hataya sebep olur.
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
// bir sabit ismi değil, bir sabit değer olarak ele alınır.
$a = \FAN; // ölümcül hata, isim alanlı tanımsız sabit: FAN
$a = Fin\FAN; // ölümcül hata, isim alanlı tanımsız sabit: bar\Fin\FAN
$a = \Fin\FAN; // ölümcül hata, isim alanlı tanımsız sabit: Fin\FAN
?>
Özel null
, true
veya false
sabitleri geçersiz kılınamaz.
Bir özel, yerleşik sabiti bir isim alanlı sabit olarak tanımlamaya
kalkışmak ölümcül hatayla sonuçlanır.
Örnek 11 - Tanımsız sabitler
<?php
namespace bar;
const NULL = 0; // ölümcül hata;
const true = 'ahmak'; // bu da ölümcül hata;
// etc.
?>