CakeFest 2024: The Official CakePHP Conference

Giriş

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

İsim alanı nedir? En dar tanımıyla, öğeleri sarmalamanın bir yoludur. Çoğu bakımdan bu soyut bir kavram gibi görünebilir. Örneğin, bir işletim sisteminin dizinleri bir birleriyle ilgili dosyaları gruplamaya yarar ve içerdiği dosyalar için bir isim alanı görevi yapar. Daha belirgin bir örnek olarak, /home/ali ve /home/veli dizinlerinde mesela.txt adında birer dosya bulunduğunu varsayalım. /home/ali dizinindeki dosyaya dizin dışından erişmek istersek dosyanın önüne dizin ayracı ile dizin adını yerleştiririz. Programcılık dünyasındaki isim alanlarına da aynı kurallar uygulanır.

PHP dünyasında isim alanları, kütüphane ve uygulama yazarlarının aşağıdaki gibi sınıflar ve işlevler gibi yeniden kullanılabilir elemanları oluşturken karşılaştıkları iki soruna çözüm getirmek amacıyla tasarlanmıştır:

  1. Yazdığınız kod ile yerleşik PHP sınıfları/işlevleri/sabitleri veya üçüncü şahısların sınıfları/işlevleri/sabitleri arasındaki isim çakışmaları.
  2. İlk sorunu hafifletmek ve kaynak kodun okunabilirliğini arttırmak için epeyce_uzun_isimlere takma ad tanımlama (veya kısaltma) yeteneği.

PHP isim alanları birbirleriyle ilişkili sınıflar, arayüzler, sabitler ve işlevleri gruplamak için bir yol sunar. PHP'deki isim alanı söz dizimi için bir örnek:

Örnek 1 - İsim alanı söz dizimi örneği

<?php
namespace isim\alanım; // "İsim Alanlarının Tanımlanması" bölümüne bakınız

class Sınıfım {}
function
işlevim() {}
const
SABİTİM = 1;

$a = new Sınıfım;
$c = new \isim\alanım\Sınıfım; // "Küresel Etki Alanı" bölümüne bakınız

$a = strlen('selam'); // "İsim alanlarının kullanımı: Son çare olarak
// küresel işlev ve sabitler" bölümüne bakınız

$d = \isim\alanım\SABİTİM; // isim alanı işleci ve __NAMESPACE__
$d = __NAMESPACE__ . '\SABİTİM'; // sabiti" bölümüne bakınız
echo constant($d); // "İsim alanları ve dinamik dil özellikleri"
// bölümüne bakınız
?>

Bilginize: İsim alanı isimleri harf büyüklüğüne duyarlıdır.

Bilginize:

İsim alanı ismi olarak PHP ve PHP\Classes gibi bu isimle başlayan bileşik isimler dahili dil kullanımına ayrılmış olup kullanıcı yazılımlarında kullanılmamalıdır.

add a note

User Contributed Notes 4 notes

up
878
SteveWa
13 years ago
Thought this might help other newbies like me...

Name collisions means:
you create a function named db_connect, and somebody elses code that you use in your file (i.e. an include) has the same function with the same name.

To get around that problem, you rename your function SteveWa_db_connect which makes your code longer and harder to read.

Now you can use namespaces to keep your function name separate from anyone else's function name, and you won't have to make extra_long_named functions to get around the name collision problem.

So a namespace is like a pointer to a file path where you can find the source of the function you are working with
up
291
Dmitry Snytkine
12 years ago
Just a note: namespace (even nested or sub-namespace) cannot be just a number, it must start with a letter.
For example, lets say you want to use namespace for versioning of your packages or versioning of your API:

namespace Mynamespace\1; // Illegal
Instead use this:
namespace Mynamespace\v1; // OK
up
177
pierstoval at gmail dot com
9 years ago
To people coming here by searching about namespaces, know that a consortium has studied about best practices in PHP, in order to allow developers to have common coding standards.

These best practices are called "PHP Standard Recommendations" , also known as PSR.

They are visible on this link : http://www.php-fig.org/psr

Actually there are 5 coding standards categories :
PSR-0 : Autoloading Standard , which goal is to make the use of Namespaces easier, in order to convert a namespace into a file path.
PSR-1 : Basic Coding Standard , basically, standards :)
PSR-2 : Coding Style Guide, where to put braces, how to write a class, etc.
PSR-3 : Logger Interface , how to write a standard logger
PSR-4 : Improved Autoloading , to resolve more Namespaces into paths.

The ones I want to point are PSR-0 and PSR-4 : they use namespaces to resolve a FQCN (Fully qualified class name = full namespace + class name) into a file path.
Basic example, you have this directory structure :
./src/Pierstoval/Tools/MyTool.php

The namespacing PSR-0 or PSR-4 standard tells that you can transform this path into a FQCN.
Read the principles of autoload if you need to know what it means, because it's almost mandatory ;) .

Structure :
{path}/autoloader.php
{path}/index.php
{path}/src/Pierstoval/Tools/MyTool.php

Files :

<?php
// {path}/index.php
include 'autoloader.php';
$tool = new Pierstoval/Tools/MyTool();
?>

<?php
// {path}/src/Pierstoval/Tools/MyTool.php
namespace Pierstoval\Tools;
class
MyTool {}
?>

<?php
// {path}/autoloader.php
function loadClass($className) {
$fileName = '';
$namespace = '';

// Sets the include path as the "src" directory
$includePath = dirname(__FILE__).DIRECTORY_SEPARATOR.'src';

if (
false !== ($lastNsPos = strripos($className, '\\'))) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
$fullFileName = $includePath . DIRECTORY_SEPARATOR . $fileName;

if (
file_exists($fullFileName)) {
require
$fullFileName;
} else {
echo
'Class "'.$className.'" does not exist.';
}
}
spl_autoload_register('loadClass'); // Registers the autoloader
?>

A standardized autoloader will get the class you want to instanciate (MyTool) and get the FQCN, transform it into a file path, and check if the file exists. If it does, it will <?php include(); ?> it, and if you wrote your class correctly, the class will be available within its correct namespace.
Then, if you have the following code :
<?php $tool = new Pierstoval/Tools/MyTool(); ?>
The autoloader will transform the FQCN into this path :
{path}/src/Pierstoval/Tools/MyTool.php

This might be the best practices ever in PHP framework developments, such as Symfony or others.
up
24
shewa12kpi at gmail dot com
2 years ago
<?php
//Here is the simple use case of namespace. See how we can use same named class with the help of namespace. This is how namespace resolve naming collision.

namespace Mobile;

class
User
{

public
$name = 'mobile user';
}

$user = new \Mobile\User;
echo
$user->name;

namespace
TV ;

class
User
{
public static
$name = 'tv user';
}

echo
\TV\User::$name;
To Top