CakeFest 2024: The Official CakePHP Conference

İsim alanlarının kullanımı: Temeller

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

İsim alanlarının kullanımından önce PHP'nin kodunuzdaki hangi isim alanlı kodu isteğinizi nasıl anlayabildiğinden bahsetmek gerekir. Bunu daha kolay anlayabilmek için PHP isim alanları ile dosya sistemleri arasındaki benzerlikten yola çıkılabilir. Bir dosya sistemindeki bir dosyaya üç yolla erişilebilir:

  1. fan.txt şeklinde göreli dosya ismiyle. Bu isim dosya sisteminde içinde bulunulan dizin geçerlidizin/ olmak üzere geçerlidizin/fan.txt olarak çözümlenir. Dolayısıyla geçerli dizin /home/veli ise dosya ismi /home/veli/fan.txt olarak çözümlenecektir.
  2. altdizin/fan.txt şeklinde göreli dosya yolu. Bu isim dosya sisteminde içinde bulunulan dizin geçerlidizin/ olmak üzere geçerlidizin/altdizin/fan.txt olarak çözümlenir.
  3. /home/veli/fan.txt şeklinde mutlak dosya yolu. Bu, /home/veli/fan.txt olarak çözümlenir.
Aynı kurallar PHP'deki isim alanlı elemanlara da uygulanabilir. Örneğin bir sınıf ismine üç şekilde başvurulabilir:
  1. $a = new fan(); veya fan::statikyöntem(); gibi bir nitelenmemiş isim veya öneksiz bir sınıf ismi. Eğer geçerli isim alanı ismi geçerlisimalanı ise bu isim, geçerlisimalanı\fan olarak çözümlenir. Eğer kod küresel ve isim alansız ise, isim fan olarak çözümlenecektir. Bir ayrıntı: Eğer isim alanlı işlev ve sabitler tanımlı ise nitelenmemiş isimli işlevler ve sabitler küresel işlevler ve sabitler olarak çözümlenir. Ayrıntılar için İsim alanlarının kullanımı: Son çare olarak küresel işlev ve sabitler bölümüne bakınız.
  2. $a = new altisimalanı\fan(); veya altisimalanı\fan::statikyöntem(); gibi bir nitelenmemiş isim veya öneksiz bir sınıf ismi. Eğer geçerli isim alanı ismi geçerlisimalanı ise bu isim, geçerlisimalanı\altisimalanı\fan olarak çözümlenir. Eğer kod küresel ve isim alansız ise, isim altisimalanı\fan olarak çözümlenecektir.
  3. $a = new \geçerlisimalanı\fan(); veya \geçerlisimalanı\fan::statikyöntem(); gibi tamamen nitelenmiş isim veya küresel önekli bir isim. Bu isim daima kodda belirtildiği gibi geçerlisimalanı\fan olarak çözümlenir.

Üç söz dizimi aşağıda örneklenmiştir:

dosya1.php

<?php
namespace Fan\Fin\altisimalanı;

const
FAN = 1;
function
fan() {}
class
fan
{
static function
statikyöntem() {}
}
?>

dosya2.php

<?php
namespace Fan\Fin;
include
'dosya1.php';

const
FAN = 2;
function
fan() {}
class
fan
{
static function
statikyöntem() {}
}

/* Nitelenmemiş isim */
fan(); // Fan\Fin\fan işlevine çözümlenir
fan::statikyöntem(); // Fan\Fin\fan sınıfının statikyöntem yöntemine çözümlenir
echo FAN; // Fan\Fin\FAN sabitine çözümlenir

/* Nitelenmiş isim */
altisimalanı\fan(); // Fan\Fin\altisimalanı\fan işlevine çözümlenir
altisimalanı\fan::statikyöntem(); // Fan\Fin\altisimalanı\fan sınıfının
// statikyöntem yöntemine çözümlenir
echo altisimalanı\FAN; // Fan\Fin\altisimalanı\FAN sabitine çözümlenir

/* Tamamen nitelenmiş isim */
\Fan\Fin\fan(); // Fan\Fin\fan işlevine,
\Fan\Fin\fan::statikyöntem(); // Fan\Fin\fan sınıfının statikyöntem yöntemine,
echo \Fan\Fin\FAN; // Fan\Fin\FAN sabitine çözümlenir
?>

Herhangi bir küresel sınıf, işlev veya sabite \strlen(), \Exception veya \INI_ALL gibi tamamen nitelenmiş isimleriyle erişilebileceğine dikkat ediniz.

Örnek 1 - Küresel sınıf, işlev ve sabitlere bir isim alanı içinden erişim

<?php
namespace Fan;

function
strlen() {}
const
INI_ALL = 3;
class
Exception {}

$a = \strlen('merhaba'); // strlen küresel işlevini çağırır
$b = \INI_ALL; // INI_ALL küresel sabitini çağırır
$c = new \Exception('error'); // Exception küresel sınıfını örnekler
?>

add a note

User Contributed Notes 5 notes

up
211
richard at richard-sumilang dot com
16 years ago
Syntax for extending classes in namespaces is still the same.

Lets call this Object.php:

<?php

namespace com\rsumilang\common;

class
Object{
// ... code ...
}

?>

And now lets create a class called String that extends object in String.php:

<?php

class String extends com\rsumilang\common\Object{
// ... code ...
}

?>

Now if you class String was defined in the same namespace as Object then you don't have to specify a full namespace path:

<?php

namespace com\rsumilang\common;

class
String extends Object
{
// ... code ...
}

?>

Lastly, you can also alias a namespace name to use a shorter name for the class you are extending incase your class is in seperate namespace:

<?php

namespace com\rsumilang\util;
use
com\rsumlang\common as Common;

class
String extends Common\Object
{
// ... code ...
}

?>

- Richard Sumilang
up
110
Anonymous
9 years ago
<?php

namespace Foo;

try {
// Something awful here
// That will throw a new exception from SPL
}
catch (
Exception as $ex) {
// We will never get here
// This is because we are catchin Foo\Exception
}
?>

Instead use fully qualified name for the exception to catch it

<?php

namespace Foo;

try {
// something awful here
// That will throw a new exception from SPL
}
catch (
\Exception as $ex) {
// Now we can get here at last
}
?>
up
48
Lukas Z
12 years ago
Well variables inside namespaces do not override others since variables are never affected by namespace but always global:
"Although any valid PHP code can be contained within a namespace, only four types of code are affected by namespaces: classes, interfaces, functions and constants. "

Source: "Defining Namespaces"
http://www.php.net/manual/en/language.namespaces.definition.php
up
39
tom at tomwardrop dot com
12 years ago
It seems the file system analogy only goes so far. One thing that's missing that would be very useful is relative navigation up the namespace chain, e.g.

<?php
namespace MyProject {
class
Person {}
}

namespace
MyProject\People {
class
Adult extends ..\Person {}
}
?>

That would be really nice, especially if you had really deep namespaces. It would save you having to type out the full namespace just to reference a resource one level up.
up
18
philip dot preisser at arcor dot de
12 years ago
Working with variables can overwrite equal variables in other namespaces

<?php // php5 - package-version : 5.3.5-1ubuntu7.2

namespace
main
{}

namespace
main\sub1
{
$data = 1;
}

namespace
main\sub2
{
echo
$data;// 1
$data = 2;
}

namespace
main\sub1
{
echo
$data;// 2
$data = 1;
}

namespace
{
echo
$data;// 1
}

?>
To Top