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

İ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::durukyö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::durukyö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::durukyö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 
durukyöntem() {}
}
?>

dosya2.php

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

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

/* Nitelenmemiş isim */
fan();              // Fan\Fin\fan işlevine çözümlenir
fan::durukyöntem(); // Fan\Fin\fan sınıfının durukyö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::durukyöntem(); // Fan\Fin\altisimalanı\fan sınıfının
                                 // durukyö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::durukyöntem(); // Fan\Fin\fan sınıfının durukyö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 add a note

User Contributed Notes 6 notes

up
138
richard at richard-sumilang dot com
9 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
59
Anonymous
3 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
23
Lukas Z
6 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
20
tom at tomwardrop dot com
5 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
5
philip dot preisser at arcor dot de
6 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
   
}

?>
up
-22
Franois Vespa
6 years ago
It seems you cannot nest a constant declaration within a if statement

<?php

namespace FOO;

if(eval)
const
BAR=true;

// will throw the following error:
// PHP Parse error:  syntax error, unexpected T_CONST

// instead use:

if(eval)
define('FOO\BAR',true);

?>
To Top