PHP の重要な機能である名前空間についていくつか考えてみます。 ! !

慕斯
リリース: 2023-04-10 06:54:01
転載
1998 人が閲覧しました

名前空間は主に、コード内のクラスと関数の間で起こり得る競合の問題を解決するために使用されることをご存知ですか?この機能は他の言語では以前からありましたが、PHP の登場が遅く、PSR-4 の登場が PSR-4 の誕生、さらに Composer の台頭のきっかけとなったので、非常に重要な機能です。

PHP の重要な機能である名前空間についていくつか考えてみます。 ! !

#ネームスペースの定義

ネームスペースはコンテナであり、主にその下のクラスと関数を識別するために使用されます。名前空間が定義されると、その下のコードはこの名前空間に属するため、名前空間の定義はコードの最初に行う必要があります。

同じパッケージの場合、同じ名前空間またはサブ名前空間内のコードは、PHP ファイルで定義する必要はありません。サブ名前空間内のコードは、特定のモジュールの作業を完了するためのものです。結合すると、パッケージ完全な名前空間になります。

作成したコードで名前空間が定義されていない場合は、そのコードがグローバル名前空間 (\ 記号) に属していることを意味するため、(\ 記号を追加せずに) クラスまたは関数を直接参照できます。

名前空間識別子を参照する 3 つの方法

(1) 完全修飾名

はオペレーティング システムの絶対パスに似ており、は完全なパスなので、理解する際に誤解はありません。

たとえば、新しい \A\B\C では、C は A\B 名前空間の C クラスに解決されます。

(2) 修飾名

は、オペレーティング システムの相対パスに似ており、名前の一部が含まれており、現在の名前空間を参照します。

たとえば、B\C() が名前空間 A で呼び出された場合、最終的に参照される名前空間は A\B\C() になります。

(3) 非修飾名

は修飾名と似ていますが、サブ名前空間は含まれません。

たとえば、C() が名前空間 A\B で呼び出された場合、最終的に参照される名前空間は A\B\C() になります。

例を使用して 3 つの参照メソッドを説明します。

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
ログイン後にコピー

注:

    名前空間内で名前空間が見つからない場合は、現在のスコープ 関数と定数の定義については、PHP はエラーを報告しません。代わりに、グローバル名前空間でそれを探してください。
  • 名前空間内で、現在のスコープにクラス定義が見つからない場合、PHP はエラーを直接報告し、対応するクラスを見つけるためにグローバル スコープに移動しません。そのため、内部またはユーザー定義クラスの場合は、完全修飾名を使用する必要があります。
まず簡単な例を見てみましょう. まず、コードを (名前空間で定義されている) 記述し、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" ;
    }
}
ログイン後にコピー

次に、テスト コードを記述します。名前空間下のコード:

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

使用する名前空間レベルが長くて多数の場合、特に使用が面倒になります。 . なので、 use キーワードを使用して名前空間、クラス、定数、関数などをインポートし、それらを使用して完全な名前を直接参照できます。 alias キーワードを使用すると、インポートされたクラスと関数の名前を変更できます。

たとえば、use キーワードの使用方法。コードはグローバル名前空間の下にあります:

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;
ログイン後にコピー

概要:

    および Pythonそれとは異なり、PHP の名前空間は意味論的な概念であり、特定のコードの場所やレイアウトとは何の関係もありません。つまり、名前空間を使用するコードは、それ自体でライブラリ ファイル (すべてのファイル) をインポートする必要があります。ライブラリ ファイルがどのように構成されているかは問題ではありません。Python では、モジュールまたはパッケージに
  • __init__.py ファイルがある場合、Python パーサーはパッケージまたはすべてのモジュールのファイルを自動的にインポートします。
  • PHP ではスコープの概念が非常に弱く、グローバル領域とローカル領域が明確に区別されており、たとえば関数やクラス内でグローバル空間の変数を参照することはできません。名前空間では状況が異なります。名前空間を定義するコードが対応する名前空間で定数と関数を見つけられない場合は、グローバル定数と関数が使用されます。また、対応する名前空間でクラス (独自の Define クラスを含む) が見つからない場合は、グローバル定数と関数が使用されます。 )、コードはエラーを直接報告します。
  • use キーワードを使用して名前空間を使用する場合、PHP はインポートされた名前空間が完全修飾名前空間であるとすでに想定しているため、完全修飾名 (\ 記号) を使用して名前空間をインポートする必要はありません。
  • 定数、関数、クラス、インターフェイス、およびその他の名前空間は、use キーワードを使用してインポートできます。
  • 名前空間は言語の機能であり、より有効な利用を追求するためには、使用方法の仕様と自動ロード機構が必要である、これが PSR-4 の仕様です。

推奨学習: 「

PHP ビデオ チュートリアル

以上がPHP の重要な機能である名前空間についていくつか考えてみます。 ! !の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:jianshu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート