Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der PHP-Namespace-Instanzen

Detaillierte Erläuterung der PHP-Namespace-Instanzen

怪我咯
怪我咯Original
2017-07-13 14:36:511715Durchsuche

PHP Namespace (Namespace) wurde in PHP 5.3 hinzugefügt. Wenn Sie C# und Java gelernt haben, ist Namespace nichts Neues. Allerdings hat es in PHP immer noch eine sehr wichtige Bedeutung.

Der PHP-Namespace kann die folgenden zwei Arten von Problemen lösen:

Namenskonflikte zwischen vom Benutzer geschriebenem Code und internen Klassen/Funktionen/Konstanten von PHP oder Klassen/Funktionen/Konstanten von Drittanbietern.

Erstellen Sie einen Aliasnamen (oder Kurznamen) für einen sehr langen Bezeichnernamen (normalerweise definiert, um die erste Art von Problem zu mildern), um die Lesbarkeit des Quellcodes zu verbessern.

Namespaces definieren

Standardmäßig werden alle Konstanten-, Klassen- und Funktionsnamen im globalen Raum platziert, genau wie vor den von PHP unterstützten Namespaces.

Ein Namespace wird mit dem Schlüsselwort namespace deklariert. Wenn eine Datei einen Namespace enthält, muss sie den Namespace vor dem gesamten anderen Code deklarieren.

Drei Möglichkeiten, auf Namespace-IDs zu verweisen

(1) Der vollständig qualifizierte Name

ähnelt einem absoluten Pfad auf dem Betriebssystem ist der vollständige Pfad, sodass beim Verständnis keine Missverständnisse entstehen.

Zum Beispiel wird C im neuen ABC in die C-Klasse unter dem AB-Namespace aufgelöst.

(2) Der qualifizierte Name

ähnelt einem relativen Pfad auf dem Betriebssystem, er enthält einen Teil des Namens und verweist auf den aktuellen Namespace.

Wenn beispielsweise BC() unter Namespace A aufgerufen wird, ist der endgültig referenzierte Namespace ABC().

(3) Der nicht qualifizierte Name

ähnelt dem qualifizierten Namen, enthält jedoch keine Unternamensräume.

Wenn beispielsweise C() unter dem Namespace AB aufgerufen wird, ist der letztendlich referenzierte Namespace ABC().

Veranschaulichen Sie die drei Zitiermethoden anhand eines Beispiels:

namespace \Example;
require_once "fnction.php";
class ClassA {}
function Function() {}
//完全限定名称
\Example\Function();
\Example\B\Function(); 
//限定名称
B\Function(); //指向 \Example\B\Function();
//非限定名称
$test = new ClassA(); //resolves to \Example\ClassA
Function(); //指向 \Example\Function

Hinweis:

•Wenn innerhalb eines Namespace keine Definitionen von Funktionen und Konstanten im aktuellen Bereich gefunden werden, meldet PHP keinen Fehler. Suchen Sie stattdessen im globalen Namespace danach.

•Wenn innerhalb eines Namespace keine Klassendefinition im aktuellen Bereich gefunden wird, meldet PHP direkt einen Fehler und geht nicht zum globalen Bereich, um die entsprechende Klasse zu finden, wenn Sie also auf eine interne Klasse verweisen müssen Bei einer benutzerdefinierten Klasse oder einer benutzerdefinierten Klasse muss der vollständig qualifizierte Name verwendet werden.

Um ein einfaches Beispiel zu geben, schreiben Sie zuerst einen Codeabschnitt (im Namespace definiert) und nennen Sie ihn function.php:

namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() 
{
  return "foo\r\n";
}
class foo 
{
  static function staticmethod()
  {
    return METHOD . "\r\n" ;
  }
  function foofunction()
  {
    return METHOD . "\r\n" ;
  }
}

Schreiben Sie dann einen Codeabschnitt test.php. auch im Code unter dem Namespace:

namespace secondsp;
include 'function.php';
class foo
{
  function foofunction()
  {
    return METHOD . "\r\n" ;
  }
}
function is_file($file)
{
  return true ;
}
//非限定名称:实例化secondsp\foo类对象
$obj = new foo; 
echo $obj->foofunction();
//实例化Foo\Bar\subnamespace\foo 类对象
$obj = new Foo\Bar\subnamespace\foo ;
echo $obj->foofunction();
//代码会报错,在命名空间内部,假如无法找到当前命名空间下的类,则会报错
//$obj = new ArrayObject(array(1)); 
$obj = new \ArrayObject(array(1)); 
//在命名空间内部,假如无法找到当前命名空间下的函数或者常量,则会寻找 native function
echo strlen("nihao");
 //引用当前命名空间下的函数
var_dump(is_file('nihao')); //True
//引用全局函数
var_dump(\is_file('nihao')); //False

import, alias

Wenn die zu verwendende Namespace-Ebene lang ist und es viele gibt, dann seien Sie besonders vorsichtig, wenn Da es Probleme mit der Verwendung gibt, können Sie mit dem Schlüsselwort use Namensräume, Klassen, Konstanten, Funktionen usw. importieren, die dann verwendet werden können, um direkt auf die vollständigen Namen zu verweisen. Das Schlüsselwort alias kann importierte Klassen und Funktionen umbenennen.

Beispielsweise zur Verwendung des Schlüsselworts use befindet sich dieser Code im globalen Namespace:

include 'function.php';
use Foo\Bar\subnamespace\foo ;
$obj = new foo;
echo $obj->foofunction();
use Foo\Bar\subnamespace\foo as aliasfunname;
$obj = new aliasfunname;
echo $obj->foofunction();
use Foo\Bar\subnamespace ; 
$obj = new subnamespace\foo ;
echo $obj->foofunction();
use Foo\Bar\subnamespace as aliasname;
$obj = new aliasname\foo ;
echo $obj->foofunction();
//由于调用代码并不在命名空间内,所以对于全局的类,无需引入使用
$obj = new ArrayObject(array(1)); 
//导入一个函数
use function Foo\Bar\subnamespace\foo  ;
echo foo();
use function Foo\Bar\subnamespace\foo as func;
echo func();
use const Foo\Bar\subnamespace\FOO;
//echo FOO;

Zusammenfassung:

• und Python Im Gegensatz dazu ist der Namespace in PHP ein semantisches Konzept und hat nichts mit der Position und dem Layout des spezifischen Codes zu tun. Mit anderen Worten: Der Code, der den Namespace verwendet, muss die Bibliotheksdateien (alle Dateien) selbst importieren wie die Bibliotheksdateien organisiert sind. Es spielt keine Rolle; wenn in Python eine init.py-Datei in einem Modul oder Paket vorhanden ist, importiert der Python-Parser automatisch die Dateien des Pakets oder aller Module.

•Das Konzept des Bereichs in PHP ist sehr schwach und die globale Domäne und die lokale Domäne werden klar unterschieden. Beispielsweise können Variablen im globalen Raum nicht in Funktionen oder Klassen referenziert werden. Bei Namespaces ist die Situation anders. Wenn der Code, der den Namespace definiert, die Konstanten und Funktionen im entsprechenden Namespace nicht finden kann, verwendet er globale Konstanten und Funktionen, und wenn er die Klasse nicht im entsprechenden Namespace finden kann (einschließlich seiner eigenen Define-Klasse). ), meldet der Code direkt einen Fehler.

•Wenn Sie den Namespace über das Schlüsselwort use verwenden, müssen Sie ihn nicht über den vollständig qualifizierten Namen (Symbol) importieren, da PHP bereits davon ausgeht, dass der importierte Namespace ein vollständig qualifizierter Namespace ist.

•Konstanten, Funktionen, Klassen, Schnittstellen und andere Namespaces können über das Schlüsselwort use importiert werden.

• Namespace ist eine Sprachfunktion. Um eine effektivere Nutzung zu erreichen, sollte es eine Verwendungsspezifikation und einen automatischen Lademechanismus geben.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der PHP-Namespace-Instanzen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn