PHP.nl

Using namespaces: Basics

Het gebruik van namespaces: Basisprincipes

Voordat we het gebruik van namespaces bespreken, is het belangrijk te begrijpen hoe PHP weet welk genamespaceerd element jouw code opvraagt. Een eenvoudige analogie kan worden gemaakt tussen PHP namespaces en een bestandssysteem. Er zijn drie manieren om toegang te krijgen tot een bestand in een bestandssysteem:

Hetzelfde principe kan worden toegepast op genamespaceerde elementen in PHP. Een klassenaam kan bijvoorbeeld op drie manieren worden aangeduid:

  1. Relatieve bestandsnaam zoals ., wat oplost naar currentdirectory/foo.txt waar currentdirectory de huidige directory is. Dus als de huidige directory /home/foo is, lost de naam op naar /home/foo/foo.txt.

  2. Relatieve padnaam zoals subdirectory/foo.txt, wat oplost naar currentdirectory/subdirectory/foo.txt.

  3. Absolute padnaam zoals /main/foo.txt, wat oplost naar /main/foo.txt.

  4. Ongeschoolde naam, of een ongeprefixeerde klassenaam zoals foo of foo. Als de huidige namespace currentnamespace is, lost dit op naar currentnamespace\foo. Als de code globaal is, niet-genamespaceerde code, lost dit op naar foo. Een kanttekening: ongeschoolde namen voor functies en constanten zullen oplossen naar globale functies en constanten als de genamespaceerde functie of constante niet is gedefinieerd. Zie fallback to global function/constant voor details.

  5. Gekwalificeerde naam, of een geprefixeerde klassenaam zoals subnamespace\foo of subnamespace\foo. Als de huidige namespace currentnamespace is, lost dit op naar currentnamespace\subnamespace\foo. Als de code globaal is, niet-genamespaceerde code, lost dit op naar subnamespace\foo.

  6. Volledig gekwalificeerde naam, of een geprefixeerde naam met de globale prefixoperator zoals \currentnamespace\foo of \currentnamespace\foo. Dit lost altijd op naar de letterlijke naam die in de code is opgegeven, currentnamespace\foo.

Hier is een voorbeeld van de drie soorten syntaxis in daadwerkelijke code:

file1.php

<?php
namespace Foo\Bar\subnamespace;

const FOO = 1;
function foo() {}
class foo
{
    static function staticmethod() {}
}
?>

file2.php

<?php
namespace Foo\Bar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo
{
    static function staticmethod() {}
}

/* Ongeschoolde naam */
foo(); // lost op naar functie Foo\Bar\foo
foo::staticmethod(); // lost op naar klasse Foo\Bar\foo, methode staticmethod
echo FOO; // lost op naar constante Foo\Bar\FOO

/* Gekwalificeerde naam */
subnamespace\foo(); // lost op naar functie Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // lost op naar klasse Foo\Bar\subnamespace\foo,
                                   // methode staticmethod
echo subnamespace\FOO; // lost op naar constante Foo\Bar\subnamespace\FOO

/* Volledig gekwalificeerde naam */
\Foo\Bar\foo(); // lost op naar functie Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // lost op naar klasse Foo\Bar\foo, methode staticmethod
echo \Foo\Bar\FOO; // lost op naar constante Foo\Bar\FOO
?>

Merk op dat om toegang te krijgen tot een globale klasse, functie of constante, een volledig gekwalificeerde naam kan worden gebruikt, zoals \strlen, \Exception of INI_ALL.

Voorbeeld: Toegang tot globale klassen, functies en constanten vanuit een namespace

<?php
namespace Foo;

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

$a = \strlen('hi'); // roept globale functie strlen aan
$b = \INI_ALL; // krijgt toegang tot globale constante INI_ALL
$c = new \Exception('error'); // instantiates globale klasse Exception
?>

Documentatie