PHP名前空間と「使用」


120

名前空間とuseステートメントに少し問題があります。

3つのファイルShapeInterface.phpShape.phpありCircle.phpます。

私は相対パスを使用してこれをやろうとしているので、これをすべてのクラスに入れました:

namespace Shape; 

私のサークルクラスには、次のものがあります。

namespace Shape;
//use Shape;
//use ShapeInterface;

include 'Shape.php';
include 'ShapeInterface.php';    

class Circle extends Shape implements ShapeInterface{ ....

includeステートメントを使用しても、エラーは発生しません。use私が得るステートメントを試してみると:

致命的なエラー:クラス 'Shape \ Shape'が/Users/shawn/Documents/work/sites/workspace/shape/Circle.phpの8行目に見つかりません

誰かがこの問題について少しアドバイスをくれませんか?


回答:


169

useオペレータは、クラス、インタフェース、または他の名前空間の名前にエイリアスを与えるためのものです。ほとんどのuseステートメントは、短縮したい名前空間またはクラスを参照しています。

use My\Full\Namespace;

以下と同等です。

use My\Full\Namespace as Namespace;
// Namespace\Foo is now shorthand for My\Full\Namespace\Foo

useオペレーターがクラス名またはインターフェース名で使用される場合、次の用途があります。

// after this, "new DifferentName();" would instantiate a My\Full\Classname
use My\Full\Classname as DifferentName;

// global class - making "new ArrayObject()" and "new \ArrayObject()" equivalent
use ArrayObject;

useオペレータはと混同しないでオートローディング。クラスはinclude、オートローダーを登録することにより(たとえば、を使用してspl_autoload_register)自動ロードされます(を使用して)。PSR-4を読んで、適切なオートローダーの実装を確認してください。


したがって、bootstrap.phpという名前の別のファイルを作成し、オートローダーを$ circle = new Circle();とともに配置すると、Circle.phpが含まれていますが、エラーが発生します:致命的なエラー:クラス6の... / Circle.phpにクラス 'Shape'が見つかりません。Circle.phpをロードしているようですが、Shape.phpをロードしていないようですCircleが定義されていますas:クラスCircle extends ShapeはShapeInterfaceを実装します
Shawn Northrop

上記のクラスから名前空間を削除すると、オートローダーが正常に動作します。ただし、シェイプクラスのインターフェイスに名前空間があると、上記のエラーが発生します
Shawn Northrop

1
例を示す要点作成しました。残念ながら要旨はサブフォルダを持つことができません。bootstrap.phpをフォルダーに配置し、他のクラスを「Shape」という名前のサブフォルダーに配置します。
cmbuckley

13

コードを名前空間に順序付ける必要がある場合は、キーワードを使用してくださいnamespace

file1.php

namespace foo\bar;

file2.php

$obj = new \foo\bar\myObj();

も使用できますuse。file2に入れた場合

use foo\bar as mypath;

ファイル内mypathbarどこかで使用する必要はありません:

$obj  = new mypath\myObj();

の使用use foo\bar;はと同じuse foo\bar as bar;です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.