ホームページ  >  記事  >  バックエンド開発  >  php名前空間インスタンスの詳しい説明

php名前空間インスタンスの詳しい説明

怪我咯
怪我咯オリジナル
2017-07-13 14:36:511715ブラウズ

PHP Namespace(名前空間) は PHP 5.3 で追加されました。C# と Java を学習したことがある場合、名前空間は新しいものではありません。 ただし、PHP では依然として非常に重要な意味を持っています。

PHP 名前空間は、次の 2 種類の問題を解決できます:

ユーザー作成コードと PHP 内部クラス/関数/定数またはサードパーティのクラス/関数/定数の間の名前の競合。

非常に長い識別子名 (通常、最初の種類の問題を軽減するために定義される) のエイリアス (または短い) 名を作成し、ソース コードの可読性を向上させます。

名前空間を定義する

デフォルトでは、PHP が名前空間をサポートする前と同様に、すべての定数、クラス、関数名はグローバル空間に配置されます。

名前空間はキーワード namespace で宣言されます。ファイルに名前空間が含まれている場合は、他のすべてのコードの前に名前空間を宣言する必要があります。

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

(1)完全修飾名

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

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

(2) 修飾名

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

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

(3) 非修飾名

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

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

例を通して 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" ;
  }
}

次に、コード test.php を書きます。これも名前空間でのコードです:

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 でライブラリ ファイルがどのように構成されているかは関係ありません。 module または package を指定すると、Python パーサーはパッケージまたはすべてのモジュールのファイルを自動的にインポートします。

•PHPにおけるスコープの概念は非常に弱く、例えばグローバル空間の変数は関数やクラス内で参照することができません。名前空間では状況が異なります。名前空間を定義するコードが対応する名前空間で定数と関数を見つけられない場合は、グローバル定数と関数が使用されます。また、対応する名前空間でクラスが見つからない場合は (独自の Define クラスを含む)、 )、コードはエラーを直接報告します。

•use キーワードを通じて名前空間を使用する場合、PHP はインポートされた名前空間が完全修飾名前空間であるとすでに想定しているため、完全修飾名 (シンボル) を通じてインポートする必要はありません。

•定数、関数、クラス、インターフェイス、その他の名前空間は、use キーワードを使用してインポートできます。

•名前空間は、より効果的な使用を追求するために、使用方法の仕様と自動ロードのメカニズムが必要です。これがPSR-4の仕様です。

以上がphp名前空間インスタンスの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。