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:
-
Relatieve bestandsnaam zoals
., wat oplost naarcurrentdirectory/foo.txtwaarcurrentdirectoryde huidige directory is. Dus als de huidige directory/home/foois, lost de naam op naar/home/foo/foo.txt. -
Relatieve padnaam zoals
subdirectory/foo.txt, wat oplost naarcurrentdirectory/subdirectory/foo.txt. -
Absolute padnaam zoals
/main/foo.txt, wat oplost naar/main/foo.txt. -
Ongeschoolde naam, of een ongeprefixeerde klassenaam zoals
foooffoo. Als de huidige namespacecurrentnamespaceis, lost dit op naarcurrentnamespace\foo. Als de code globaal is, niet-genamespaceerde code, lost dit op naarfoo. 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. -
Gekwalificeerde naam, of een geprefixeerde klassenaam zoals
subnamespace\fooofsubnamespace\foo. Als de huidige namespacecurrentnamespaceis, lost dit op naarcurrentnamespace\subnamespace\foo. Als de code globaal is, niet-genamespaceerde code, lost dit op naarsubnamespace\foo. -
Volledig gekwalificeerde naam, of een geprefixeerde naam met de globale prefixoperator zoals
\currentnamespace\fooof\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
?>