Grundläggande

Från Wiki.linux.se
Version från den 19 augusti 2024 kl. 10.49 av Admin (diskussion | bidrag)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

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:

  1. Relativt filnamn som foo.txt. Detta löser sig till currentdirectory/foo.txt där currentdirectory ä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.
  2. Relativ sökväg som subdirectory/foo.txt. Detta löser sig till currentdirectory/subdirectory/foo.txt.
  3. 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(); eller foo::staticmethod();. Om den aktuella namnrymden är currentnamespace, löses detta till currentnamespace\foo. Om koden är global, icke-namnrymd kod, löses detta till foo. 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(); eller subnamespace\foo::staticmethod();. Om den aktuella namnrymden är currentnamespace, löses detta till currentnamespace\subnamespace\foo. Om koden är global, icke-namnrymd kod, löses detta till subnamespace\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/