PHPコマンドスペースの名前空間の使い方と用途(例)

墨辰丷
リリース: 2023-03-26 07:54:02
オリジナル
2077 人が閲覧しました

この記事では、主に PHP コマンド空間の名前空間の使用法と用途についての実践的な概要を紹介します。必要な方は参考にしてください。

名前空間の最も明確な目的の 1 つは、名前の重複の問題を解決することです。 PHP 名で同じにすることはできません。そうしないと、致命的なエラーが発生します。この場合、名前の重複を避ける限り解決できます。最も一般的な方法は、プレフィックスを合意することです。

名前空間を使用する目的:

チームプロジェクトで作業する場合、個人がプロジェクトを担当する場合は、その前後に作成された新しいクラスとの競合を回避します。

個人的な理解によると、必要なクラスをrequireまたはincludeで先に導入する必要があるため、クラス再定義エラーが発生する前提条件は同名のクラスが2つ導入されていることです。現在、一部の PHP フレームワークは、新しく作成されたすべてのモデル クラスを自動的にロード (つまり、インクルード) するため、新しいモデル クラスとプロジェクト フレームワークのネイティブ コア クラス間の名前の競合を避けるために、名前空間が使用されます。 (よく考えてみると、チームメンバーが作成した新しいクラスとの競合は、コミュニケーションを通じて回避する必要があります。インシデントが発生した後でも、後のクラス理解の混乱による保守の複雑さの増加を避けるために、クラス名をすぐに再調整して保守する必要があります。 )

使用方法と組み合わせることで、その目的をさらに理解できます。

名前空間の使用方法:

テストのために、1.phpとname.php(このファイルはテストを実行するために使用されます)の3つのファイルを作成します。これについては後で説明しません。注意してください。コードを自分で変更します。

1. 名前空間の名前付けの定義は大文字と小文字を区別しません

namespace one;

namespace One;
namespace ONE;

上記のように記述できますが、独自の仕様として選択するだけです。 (次のコードでは、最初の方法をテストに使用します)

2. 名前空間が定義されていない場合は、トップレベルの名前空間を使用するものとみなされます。新しいクラスを作成するときは、クラスの前にバックスラッシュを追加するかどうかを選択できます。

//1.php 
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
//name.php
require_once './1.php';
new Person(); //输出 I am one!;
new \Person(); //输出 I am one!;
ログイン後にコピー

3. 新しいクラスを追加するとき、名前空間を持ち込むときは、スラッシュの代わりにバックスラッシュ文字を使用する必要があります。

記憶方法: % 内のスラッシュを見つける順序に従い、スラッシュとして解釈します。 (バックスラッシュと言っても、どっちの方向なのかも分からないことがあります。昔は左から右への昇順で覚えていましたが、今ではあまりにもあてにならない気がします)

//name.php
require_once './1.php';
new /Person(); // 代码报错:Parse error: syntax error, unexpected '/'
ログイン後にコピー

4. カテゴリは、名前空間に新しいクラスを指定する場合、指定された名前空間を含める必要があります。

指定された名前空間はありません。 ポイント 2 によると、php はトップレベルの名前空間からこのクラスを見つけます。覚えておいてください: 最上位の名前空間には他のすべての名前空間が含まれるため、これは理解できません。代わりに、トップレベルの名前空間は他の名前空間から完全に分離する必要があります。

//1.php 
namespace one;
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
//name.php
require_once './1.php';
new \one\Person(); //输出 I am one!;
new \Person(); //代码报错:Fatal error: Class 'Person' not found
ログイン後にコピー

は、次の一般的な例で理解できます。指定された名前空間を取ることは、誰かのリンゴ (手に持っている) を表し、最上位の名前空間はリンゴの箱の中のリンゴ (箱の中) を表します。誰かのリンゴを見つけたい場合は、誰かの名前空間を持ってくる必要があります。そうしないと、箱から誰かのリンゴを探すことになりますが、当然見つかりません。

5. 名前空間宣言後のコードはこの名前空間に属しており、include や require があっても影響を受けません(文の後半の理解に重点を置いています。詳細はコードを参照してください)。 。

//1.php 
namespace one;
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
//name.php
namespace test;
require './1.php'; 
new \one\Person(); //输出 I am one!;
new Person(); //这里结果会是什么呢,猜猜看
ログイン後にコピー

最後の行はエラーになります:

Fatal error: Class 'test\Person' not found
ログイン後にコピー

まず第一に、これをポイント 2 と比較してください:

ポイント 2、私が言いました、名前空間がない場合、名前空間がある場合新しいクラス、新しいクラスはありますか? バックスラッシュは同じ意味を持ちます。

ここで、名前空間では、バックスラッシュがあるのとないのとでは意味が異なります。

最後の行を

new \Person();
ログイン後にコピー

に置き換えると、結果はエラーになります:

Fatal error: Class 'Person' not found
ログイン後にコピー

それでは、現在の点について話しましょう。

コードの最後の行に対応する名前空間は test であることがわかります。これは、require ファイルの名前空間の影響を受けません。

検証をさらに強化するために、name.php ファイルを次のように変更しました:

//name.php
namespace test;
require './1.php'; 
class Person{
 function __construct(){
  echo 'I am test!';
 }
}
new \one\Person(); //输出 I am one!;
new Person(); //这里结果会是什么,自己猜猜看
ログイン後にコピー

最後に、この例は、require についての私の理解を新たにしました。

require についての以前の理解によれば、PHP プログラムが実行される前に、まず require で指定されたファイルを読み込み、それを PHP プログラムの Web ページの一部にします。したがって、私はこれを単に抽出したコードを元の場所に戻すだけの置換として理解することがよくあります。次に、1.php ファイルの内容を name.php に入れようとしました:

//name.php
namespace test;
namespace one;
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
class Person{
 function __construct(){
  echo 'I am test!';
 }
}
ログイン後にコピー

新しいクラスがないと、ファイルはエラーを報告します:

致命的なエラー: クラス oneperson を再宣言できません

ようです単純です。require は置換として理解されますが、ここでは機能しません。

6. 名前空間にはクラス名と同じ名前の部分があってもクラスを表すものではありません。新しいクラスの場合でも、この部分を持ってくる必要があります。

//name.php
namespace test\person;
class Person{
 function __construct(){
  echo 'I am test!';
 }
}new \test\person\Person();  //命名空间里person无法代表类名
ログイン後にコピー

しかし、これは全くの余計なことなので、名前空間にクラス名を含めないでください。

7. php ファイルには複数の名前空間が存在でき、最初の名前空間の前にコードを含めることはできません。

只说第一个命名空间前不能有任何代码,之后的命名空间之前可以有代码。这个自行测试即可。

//name.php
namespace test;
echo 'zhai14';
namespace zhai;
require './1.php';
ログイン後にコピー

php命名空间namespace告一段落了,接下来说说use的用途。

使用use的目的:

在命名空间字符串过长时,使用use可以相应的缩短命名空间。

use的使用方法:

1.new类时,最前面无需用反斜杠。此外,use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。

//name.php
namespace animal\dog;
class Life{
 function __construct(){
  echo 'dog life!';
 }
}
namespace animal\cat;
class Life{
 function __construct(){
  echo 'cat life!';
 }
}
new Life(); //按照代码执行顺序,这里默认animal\cat这个命名空间
new \animal\dog\Life(); //A
use animal\dog; //a
new dog\Life(); //B
use animal\dog as d; //b
new d\Life();
ログイン後にコピー

通过A、B行代码比较,需要注意:

使用use后,new类时,最前面没有反斜杠。

没使用use时,命名空间最前面有反斜杠

通过a、b行代码比较,可以理解:

use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。如上的:

use animal\dog;

相当于

use animal\dog as dog;

2.namespace后面不建议加类名,但use后可以。

//name.php
namespace animal\dog;
class Life{
 function __construct(){
  echo 'dog life!';
 }
}
namespace animal\cat;
class Life{
 function __construct(){
  echo 'cat life!';
 }
}
use animal\dog\Life as dog; 
new dog();
ログイン後にコピー

如上所示,use后加上类名后,就相当于把类改了个名称:由Life改为dog了。

上面不用as dog就会报错:

Fatal error: Cannot use animal\dog\Life as Life because the name is already in use
因为cat下也有个一样名称的Life类。

可以理解为,使用use后,这个昵称对应的类只能归当前命名空间占有,其它命名空间下不允许存在该类。

//name.php
namespace animal\dog;
class Life{
 function __construct(){
  echo 'dog life!';
 }
}
class Dog{
 function __construct(){
  echo 'dog in dog!';
 }
}
namespace animal\cat;
// class Dog{
// function __construct(){
//  echo 'dog in cat!';
//  }
// }
class Life{
 function __construct(){
  echo 'cat life!';
 }
}
use animal\dog; 
new dog\Dog();
ログイン後にコピー

如上,使用了

use animal\dog;
cat

通过上面代码,我想使用use的目的效果(缩短命名空间名称)就很明显了。

简单总结一下:

namespace就是划分领域的作用,代表这些东西是属于某个命名空间下的。

use就是起小名的作用,不论写起来还是说起来都可以省不少事儿。

相关推荐:

PHP命令空间的用法大全

php user_error()函数的简介

有关php user_error()函数的文章推荐10篇

以上がPHPコマンドスペースの名前空間の使い方と用途(例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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