Heim  >  Artikel  >  Backend-Entwicklung  >  Über PHP-Namespaces

Über PHP-Namespaces

不言
不言Original
2018-05-14 15:52:263837Durchsuche

Dieser Artikel stellt den Namespace von PHP vor, der einen bestimmten Referenzwert hat. Jetzt können Freunde in Not darauf verweisen.

Was ist PHP-Namespace?

PHP-Handbuch. Im Großen und Ganzen sind Namespaces eine Möglichkeit, Dinge zu kapseln. Diese Abstraktion ist an vielen Stellen zu finden. Verzeichnisse werden beispielsweise in Betriebssystemen verwendet, um zusammengehörige Dateien zu gruppieren, und sie fungieren als Namespaces für die Dateien im Verzeichnis.

Die Rolle des Namespace

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 (der normalerweise zur Linderung des ersten Problemtyps definiert wird), um die Lesbarkeit des Quellcodes zu verbessern.

Beispiel

Ich habe diesen Namespace-Artikel geschrieben, weil ein Freund das gerade erfahren hat und mich gefragt hat, was ein Namespace ist. Ich habe mich gefragt, wie ich es einfach beschreiben und leicht verständlich machen kann. Im Folgenden werde ich anhand einiger einfacher Beispiele mein eigenes Verständnis von Namespaces veranschaulichen.

1.Beispiel 1
Zuerst erstellen wir zwei Klassendateien
a.php

class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b .php

class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

Erstellen Sie eine weitere index.php-Datei, um die beiden oben genannten Klassen einzuführen und die darin enthaltenen Methoden aufzurufen.
index.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: Klasse Test kann nicht erneut 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

namespace a\test;class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

namespace b\test;class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

Das Namespace-Schlüsselwort wird verwendet, um das zu deklarieren Name räumlich. Führen Sie nun index.php aus und stellen Sie fest, dass keine Fehler vorliegen. Ändern Sie index.php, um einen Methodenaufruftest durchzuführen
index.php

require_once("a.php");require_once("b.php");$a = new a\test\Test();$a->test();//页面输出:this is A class.

3 . Beispiel 3
Jetzt gibt es eine andere Situation: Ich muss die Testklasse mehrmals in einer.php instanziieren. Was ist, wenn es schwierig ist, jedes Mal die vollständigen Namespace-Informationen zu schreiben? Tun? Zum Beispiel:
index.php

require_once("a.php");require_once("b.php");$a = new a\test\Test();$a_a = new a\test\Test();$a_b = new a\test\Test();$a->test();$a_a->test();//页面输出:this is A class.this is A class.

Obwohl kein Fehler vorliegt, wird es für Sie schwieriger sein, den vollständigen Namensraumnamen einzugeben Fehler wird gemeldet und es kann Strg+C, Strg+V sein, aber nicht sehr schön (^_^).
Sie können dies tun:
index.php

require_once("a.php");require_once("b.php");use a\test\Test;$a = new Test();$a_a = new Test();$a_b = new Test();$a->test();$a_a->test();//页面输出:this is A class.this is A class.

Das Schlüsselwort use wird verwendet, um eine Klasse einzuführen und einen Namespace zu verwenden, um die Verwendung von anzugeben eine bestimmte Kategorie. Sie können den Vorgang später direkt instanziieren
4. Beispiel 5
Dann kommt ein weiteres Problem wie folgt:
index.php

require_once("a.php");require_once("b.php");use a\test\Test;use b\test\Test;$a = new Test();$b = new Test();$a->test();$b->test();

Offensichtlich ein weiterer schwerwiegender Fehler: Schwerwiegender Fehler: Kann btestTest nicht als Test verwenden, da der Name bereits in verwendet wird. . . Denn obwohl der Namespace verwendet wird, haben beide Klassen den gleichen Namen. Das Programm weiß nicht, dass die zweite Testklasse die Testklasse in b.php ist. Zu diesem Zeitpunkt verwenden Sie das Schlüsselwort
Zum Beispiel:
index.php

require_once("a.php");require_once("b.php");use a\test\Test;use b\test\Test as BTest;$a = new Test();$b = new BTest();$a->test();$b->test();//页面输出:this is A class.this is B class.完美解决

as Schlüsselwort definiert einen Alias ​​für den Klassennamen, der Konflikte mit demselben Klassennamen effektiv verhindern kann
5. Beispiel 6
Das Folgende ist eine andere Situation, die ich zuerst ein paar Codeausschnitte nennen werde, die nichts mit dem Framework zu tun haben. Sie dienen lediglich der Veranschaulichung. Sie können dies an vielen Stellen sehen.

if (\Yii::$app->request->isPost) {
            $post = \Yii::$app->request->post();           ...
        }

Natürlich wird hier eine Yii-Klasse verwendet, aber warum steht davor ein weiterer Backslash? Einige Schüler werden sich fragen, wie man sie verfolgt PHPstorm-Editor, drücken und halten Sie direkt Strg, klicken Sie mit der Maus auf den Klassennamen und es wird zu dieser Klassendatei gesprungen Informationen zur Verwendung des PHPstorm-Editors finden Sie unter: PHPStorm Cracked Versions- und Verwendungs-Tutorial
Das Folgende ist der Codeausschnitt der Yii-Klasse:

/**
 * Yii bootstrap file.
 *
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */require(__DIR__ . '/BaseYii.php');class Yii extends \yii\BaseYii{
}

Sie werden feststellen, dass die Yii-Klasse keinen Namespace hat, wenn Sie möchten Um es zu verwenden, müssen Sie vor der Klasse einen Backslash hinzufügen.
Zum Beispiel erstellen wir eine globale Klassendatei auf derselben Ebene wie a.php: c.php:

class Test{
    public function test()
    {
        echo "this is C class.";
    }
}

Tun Sie dies in der Datei index.php, um die Methode test in c.php aufzurufen

require_once("a.php");
require_once("b.php");
require_once("c.php");
use a\test\Test;use b\test\Test as BTest;
$a = new Test();$b = new BTest();
$c = new \Test();
$a->test();$b->test();
$c->test();
//页面输出:
this is C class.this is A class.this is B class.this is C class.

Hinweis: Verwendung von Schlüsselwörtern wie Namespace, Verwendung, As und Verwendung globaler Klassen.

Was ist ein PHP-Namespace?

PHP-Handbuch: Im Großen und Ganzen ist ein Namespace eine Möglichkeit, Dinge zu kapseln. Dieses abstrakte Konzept findet sich vielerorts. Verzeichnisse werden beispielsweise in Betriebssystemen verwendet, um zusammengehörige Dateien zu gruppieren, und sie fungieren als Namespaces für die Dateien im Verzeichnis.

Die Rolle des Namespace

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 (der normalerweise zur Linderung des ersten Problemtyps definiert wird), um die Lesbarkeit des Quellcodes zu verbessern.

示例

写这个命名空间的文章是因为一个朋友刚学这个来问我命名空间到底是个什么东西。我在想怎么简单的描述出来并且很容易理解。下面我就以几个简单的小例子来说明一下我自己对命名空间的理解。

1. 例一
首先我们先建立两个类文件
a.php

class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

再建立一个index.php文件,来引入以上两个类并调用其中的方法。
index.php

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

现在运行index.php文件,你会发现有一个致命错误: Fatal error: Cannot redeclare class Test in。。。很显然,无法重新声明Test类,因为你引入了两次,而且两个文件中的类名称相同,冲突了。这个时候就需要命名空间来解决这个问题,并且很容易。
2. 例二
我们现在把两个类文件稍作修改。
a.php

namespace a\test;class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

namespace b\test;class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

namespace关键字是用来声明命名空间的。现在运行index.php发现没有错误,修改index.php进行方法调用测试
index.php

require_once("a.php");require_once("b.php");$a = new a\test\Test();$a->test();//页面输出:this is A class.

3. 例三
现在有另外一种情况,比如我需要实例化a.php中的Test类多次,那么每次我们都需要命名空间信息完整写的话比较麻烦怎么办呢?比如:
index.php

require_once("a.php");
require_once("b.php");
$a = new a\test\Test();
$a_a = new a\test\Test();
$a_b = new a\test\Test();
$a->test();
$a_a->test();
//页面输出:
this is A class.this is A class.

虽然也没有错误,但是你会发现比较麻烦,每次都需要全写命名空间名称,虽然不报错并且可以ctrl+c,ctrl+v,但是不太美观(^_^)。
你可以这样做:
index.php

require_once("a.php");
require_once("b.php");
use a\test\Test;
$a = new Test();
$a_a = new Test();
$a_b = new Test();
$a->test();
$a_a->test();
//页面输出:
this is A class.this is A class.

use关键字是用来引入类,用命名空间的方式表示使用了某个类。后面就可以直接实例化操作
4. 例五
接下来另一个问题又来了,如下:
index.php

require_once("a.php");require_once("b.php");use a\test\Test;use b\test\Test;$a = new Test();$b = new Test();$a->test();$b->test();

很明显,又一个致命错误:Fatal error: Cannot use b\test\Test as Test because the name is already in use in 。。。因为虽然使用了命名空间,但是两个类名称相同,都是Test,程序不知道第二个Test类是b.php中的Test类,这时候你就用到了as关键字
如:
index.php

require_once("a.php");
require_once("b.php");
use a\test\Test;
use b\test\Test as BTest;
$a = new Test();
$b = new BTest();
$a->test();$b->test();
//页面输出:
this is A class.this is B class.完美解决

as关键字是对类名称定义别名,可以有效防止类名称相同冲突
5. 例六
下面是另一种情况,我先给出几个代码片段,是Yii2框架中的,和框架无关,只是为了演示使用,很多地方都能见到此例。

if (\Yii::$app->request->isPost) {
            $post = \Yii::$app->request->post();           ...
        }

很显然这里使用了一个Yii类,但是为什么前面又一个反斜杠”\”,我们先追踪一下Yii类,有的同学会问怎么追踪呢,如果你使用的是PHPstorm编辑器,直接按住Ctrl,鼠标点击类名就会跳到此类类文件中,关于怎么使用PHPstorm编辑器,请查看:PhpStorm破解版及使用教程
下面是Yii类文件代码段:

/**
 * Yii bootstrap file.
 *
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */require(__DIR__ . '/BaseYii.php');class Yii extends \yii\BaseYii{
}

你会发现该Yii类并没有命名空间,我们将这种类叫做全局类,如果要使用需要类前面加入反斜杠”\”
比如我们在a.php同级再建立一个全局类文件:c.php:

class Test{
    public function test()
    {
        echo "this is C class.";
    }
}

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

require_once("a.php");
require_once("b.php");
require_once("c.php");
use a\test\Test;
use b\test\Test as BTest;
$a = new Test();
$b = new BTest();
$c = new \Test();
$a->test();
$b->test();
$c->test();
//页面输出:
this is C class.this is A class.this is B class.this is C class.

注意:namespace,use,as等关键字用法以及全局类的使用。

Das obige ist der detaillierte Inhalt vonÜber 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:Einige grundlegende PHP-SyntaxNächster Artikel:Einige grundlegende PHP-Syntax