Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in PHP-Namespaces

Einführung in PHP-Namespaces

不言
不言Original
2018-07-05 10:27:201221Durchsuche

In diesem Artikel wird hauptsächlich der PHP-Namespace vorgestellt, der einen bestimmten Referenzwert hat. Jetzt können Freunde in Not darauf verweisen

( PHP 5 >= 5.3.0, PHP 7)

Was ist ein Namespace? Im Großen und Ganzen ist ein Namespace eine Möglichkeit, Dinge zu kapseln. Diese Abstraktion ist an vielen Stellen zu finden. Beispielsweise werden Verzeichnisse in Betriebssystemen verwendet, um zusammengehörige Dateien zu gruppieren, und sie fungieren als Namespaces für die Dateien im Verzeichnis. Beispielsweise kann die Datei

foo.txt

gleichzeitig in den Verzeichnissen /home/greg und /home/other vorhanden sein, jedoch nicht im selben Verzeichnis. Es gibt zwei foo.txt-Dateien. Wenn wir außerdem auf die Datei foo.txt außerhalb des Verzeichnisses /home/greg zugreifen, müssen wir den Verzeichnisnamen und das Verzeichnistrennzeichen vor den Dateinamen setzen, um /home zu erhalten /greg /foo.txt. Die Anwendung dieses Prinzips auf den Bereich der Programmierung ist das Konzept des Namespace. In PHP werden Namespaces verwendet, um zwei Arten von Problemen zu lösen, die beim Erstellen von wiederverwendbarem Code wie Klassen oder Funktionen beim Schreiben von Klassenbibliotheken oder Anwendungen auftreten:

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

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

  3. Während jeder legale PHP-Code in einen Namespace aufgenommen werden kann, sind nur die folgenden Codetypen von Namespaces betroffen: Klassen (einschließlich abstrakter Klassen und Merkmale), Schnittstellen, Funktionen und Konstanten. Der Namespace

wird mit dem Schlüsselwort

namespace

deklariert. Wenn eine Datei einen Namensraum enthält, muss sie den Namensraum vor allen anderen Codes deklarieren, außer einem: dem Schlüsselwort „declare“. Der einzige zulässige Code vor der Deklaration eines Namespace ist die

declare

-Anweisung, die die Kodierung der Quelldatei definiert. Darüber hinaus kann der gesamte Nicht-PHP-Code, einschließlich Leerzeichen, nicht vor der Namespace-Deklaration erscheinen:

<html>
<?php
namespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句?>
Darüber hinaus kann im Gegensatz zu anderen Sprachfunktionen von PHP derselbe Namespace in mehreren Dateien definiert werden, was das Teilen ermöglicht Inhalte desselben Namensraums speichern und in verschiedenen Dateien speichern.

1.

Beispiel 1 Zuerst erstellen wir zwei Klassendateien

a.php

<?phpclass Test
{    public function ceshi(){        echo __FILE__;
    }
}

b.php

<?phpclass Test
{    public function ceshi(){        echo __FILE__;
    }
}

index.php

<?php
require_once("a.php");
require_once("b.php");

Führen Sie nun die Datei index.php aus

Sie werden einen schwerwiegenden Fehler finden: Schwerwiegender Fehler: Die Klasse „Test in“ kann nicht neu deklariert werden. . . Offensichtlich kann die Testklasse nicht erneut deklariert werden, da Sie sie zweimal eingeführt haben und die Klassennamen in den beiden Dateien identisch sind, was zu Konflikten führt. Derzeit ist ein Namespace erforderlich, um dieses Problem zu lösen, und das ist einfach.

2. Beispiel 2 Wir modifizieren nun die beiden Klassendateien leicht.

a.php

<?php
namespace demo1\a\Test;class Test
{    public function ceshi(){        echo __FILE__;
    }
}

b.php

<?php
namespace demo1\b\Test;class Test
{    public function ceshi(){        echo __FILE__;
    }
}

Das Schlüsselwort namespace wird verwendet, um einen Namespace zu deklarieren von. Führen Sie nun index.php aus und stellen Sie fest, dass keine Fehler vorliegen. Ändern Sie index.php, um den Methodenaufruf zu testen

index.php

<?php
require_once("a.php");
require_once("b.php");
$a1 = new demo1\a\Test\Test();
$a1->ceshi();

Führen Sie nun die Datei index.php

D:phpStudyWWWdemodemo1a.php

3 aus.

Beispiel 3 Jetzt gibt es zum Beispiel eine andere Situation Ich muss eine Testklasse in .php instanziieren, die mehrmals verwendet wird. Was sollen wir also tun, wenn es schwierig ist, jedes Mal die vollständigen Namespace-Informationen zu schreiben? Beispiel:

<?php
require_once("a.php");
require_once("b.php");
$a1 = new demo1\a\Test\Test();
$a2 = new demo1\a\Test\Test();
$a1->ceshi();echo '
'; $a2->ceshi();

Obwohl kein Fehler vorliegt, ist es für Sie schwieriger, den vollständigen Namensraumnamen einzugeben. Obwohl kein Fehler gemeldet wird, kann Strg+V verwendet werden , es ist nicht sehr schön (^ _^).

Sie können dies tun

index.php

<?php
require_once("a.php");
require_once("b.php");
use demo1\a\Test\Test;
$a1 = new Test();
$a2 = new Test();
$a1->ceshi();
echo '
'; $a2->ceshi();

Das Schlüsselwort use wird zum Einführen von Klassen verwendet, die durch Namespaces dargestellt werden. Eine bestimmte Klasse verwendet wird. Sie können die Operation später direkt instanziieren

4.

Beispiel 5 Dann kommt wieder eine andere Frage, wie folgt:

index.php

<?php
require_once("a.php");
require_once("b.php");
use demo1\a\Test\Test;
use demo1\b\Test\Test;
$a = new Test();
$b = new Test();
$a->ceshi();
echo '
'; $b->ceshi();

Führen Sie jetzt die Datei index.php aus

Schwerwiegender Fehler: Demo1bTestTest kann nicht als Test verwendet werden, da der Name bereits verwendet wird in D:phpStudyWWWdemodemo1index.php online

5

Denn obwohl der Namespace verwendet wird, haben die beiden Klassen den gleichen Namen, beide sind Test und das Programm tut es Ich weiß nicht, welche der beiden Testklassen die Testklassen in b.php sind. Zu diesem Zeitpunkt verwenden Sie das as-Schlüsselwort

index.php

<?php
require_once("a.php");
require_once("b.php");
use demo1\a\Test\Test;
use demo1\b\Test\Test as bTest;
$a = new Test();$b = new bTest();
$a->ceshi();echo '
'; $b->ceshi();
Das Schlüsselwort as definiert einen Alias ​​für den Klassennamen, der Konflikte mit demselben Klassennamen wirksam verhindern kann

5.

Beispiel 6

Für Wenn wir uns beispielsweise auf der gleichen Ebene wie a.php befinden, erstellen Sie eine weitere globale Klassendatei: c.php:

c.php

<?php
class Test{    
public function ceshi(){        
echo __FILE__;
    }
}

在index.php文件中这样做即可调用c.php中的test方法

<?php
require_once("a.php");
require_once("b.php");
require_once("c.php");
use demo1\a\Test\Test;
use demo1\b\Test\Test as bTest;
$a = new Test();$a->ceshi();
echo '
'; $b = new bTest(); $b->ceshi(); echo '
'; $c = new \Test(); $c->ceshi(); echo '
';

我们将这种类叫做全局类,如果要使用需要类前面加入反斜杠”\” 

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于PHP多态的理解

PHP文件编程的介绍

Das obige ist der detaillierte Inhalt vonEinführung in PHP-Namespaces. 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
Vorheriger Artikel:PHP-Polymorphismus verstehenNächster Artikel:PHP-Polymorphismus verstehen