Grundläggande
Användning av namnrymder: Grunder
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Innan vi diskuterar användningen av namnrymder är det viktigt att förstå hur PHP vet vilken element i namnrymden din kod begär. En enkel analogi kan göras mellan PHP-namnrymder och ett filsystem. Det finns tre sätt att komma åt en fil i ett filsystem:
- **Relativt filnamn** som
foo.txt
. Detta löser sig tillcurrentdirectory/foo.txt
därcurrentdirectory
är den katalog som för närvarande används. Om den aktuella katalogen är/home/foo
, kommer namnet att lösas till/home/foo/foo.txt
. - **Relativ sökväg** som
subdirectory/foo.txt
. Detta löser sig tillcurrentdirectory/subdirectory/foo.txt
. - **Absolut sökväg** som
/main/foo.txt
. Detta löser sig till/main/foo.txt
.
Samma princip kan tillämpas på namnrymdselement i PHP. Till exempel kan ett klassnamn refereras på tre sätt:
- **Okvalificerat namn**, eller ett oprefixerat klassnamn som
$a = new foo();
ellerfoo::staticmethod();
. Om den aktuella namnrymden ärcurrentnamespace
, löses detta tillcurrentnamespace\foo
. Om koden är global, icke-namnrymd kod, löses detta tillfoo
. En varning: okvalificerade namn för funktioner och konstanter kommer att lösas till globala funktioner och konstanter om den namnrymda funktionen eller konstanten inte är definierad. Se Använda namnrymder: fallback till global funktion/konstant för detaljer. - **Kvalificerat namn**, eller ett prefixerat klassnamn som
$a = new subnamespace\foo();
ellersubnamespace\foo::staticmethod();
. Om den aktuella namnrymden ärcurrentnamespace
, löses detta tillcurrentnamespace\subnamespace\foo
. Om koden är global, icke-namnrymd kod, löses detta tillsubnamespace\foo
. - **Fullständigt kvalificerat namn**, eller ett prefixerat namn med globalt prefixoperatör som
$a = new \currentnamespace\foo();
eller\currentnamespace\foo::staticmethod();
. Detta löses alltid till det bokstavliga namn som specificeras i koden,currentnamespace\foo
.
Här är ett exempel på de tre typerna av syntax i faktisk kod:
'''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() {} } /* Okvalificerat namn */ foo(); // löses till funktionen Foo\Bar\foo foo::staticmethod(); // löses till klassen Foo\Bar\foo, metod staticmethod echo FOO; // löses till konstanten Foo\Bar\FOO /* Kvalificerat namn */ subnamespace\foo(); // löses till funktionen Foo\Bar\subnamespace\foo subnamespace\foo::staticmethod(); // löses till klassen Foo\Bar\subnamespace\foo, // metod staticmethod echo subnamespace\FOO; // löses till konstanten Foo\Bar\subnamespace\FOO /* Fullständigt kvalificerat namn */ \Foo\Bar\foo(); // löses till funktionen Foo\Bar\foo \Foo\Bar\foo::staticmethod(); // löses till klassen Foo\Bar\foo, metod staticmethod echo \Foo\Bar\FOO; // löses till konstanten Foo\Bar\FOO ?>
Observera att för att komma åt någon global klass, funktion eller konstant kan ett fullständigt kvalificerat namn användas, till exempel \strlen()
eller \Exception
eller \INI_ALL
.
Exempel #1: Åtkomst till globala klasser, funktioner och konstanter inom en namnrymd
<?php namespace Foo; function strlen() {} const INI_ALL = 3; class Exception {} $a = \strlen('hi'); // anropar den globala funktionen strlen $b = \INI_ALL; // åtkomst till den globala konstanten INI_ALL $c = new \Exception('error'); // instansierar den globala klassen Exception ?>
Sidslut
Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.namespaces.basics.php
PHP
Språkreferens
Språkreferens#Namnrymder
Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/