ホームページ  >  記事  >  バックエンド開発  >  PHP コマンドスペースの完全な使用

PHP コマンドスペースの完全な使用

php中世界最好的语言
php中世界最好的语言オリジナル
2017-12-20 14:55:592208ブラウズ

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

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

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

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

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

名前空間 one;

名前空間 One;

名前空間 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 testpersonperson(); // person は名前空間内のクラス名を表すことはできません

ただし、これは全くの不要であり、名前空間にクラス名を含めないでください。

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

最初の名前空間の前にコードがあってはならず、後続の名前空間の前にコードがあってもよいとだけ言っています。これは自分でテストできます。

//name.php
namespace test;
echo 'zhai14';
namespace zhai;
require './1.php';

php namespace

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就是划分领域的作用,代表这些东西是属于某个命名空间下的。


相信看了这些案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

相关阅读:

php自定义函数生成笛卡尔积的方法

PHP自定义函数生成笛卡尔积

多个数组求笛卡尔积


以上がPHP コマンドスペースの完全な使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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