ホームページ  >  記事  >  バックエンド開発  >  PHP 名前空間の使用法の詳細な例

PHP 名前空間の使用法の詳細な例

巴扎黑
巴扎黑オリジナル
2017-08-23 13:48:251821ブラウズ

名前空間は主に、コード内のクラスと関数の間で起こり得る競合の問題を解決するために使用されます。この記事では、名前空間の定義やその他の知識ポイントを含む、PHP の主要な機能を紹介します。名前空間は、主にコード内のクラスと関数間の競合の問題を解決するために使用されます。この機能は他の言語には早くからありましたが、PHP は遅れて登場し、PSR-4 が誕生し、さらに Composer の台頭も生まれたため、非常に重要な機能です。

名前空間の定義

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

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

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

名前空間識別子を参照する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" ;
  }
}

次に、コードの一部を書きます。これも、 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

使用する名前空間の階層が長くて数が多い場合は特に使用が面倒なので、 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 中国語 Web サイトの他の関連記事を参照してください。

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