web-dev-qa-db-ja.com

PHP名前空間と「使用」

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

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

相対パスを使用してこれを実行しようとしているので、これをすべてのクラスに入れました:

namespace Shape; 

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

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

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

class Circle extends Shape implements ShapeInterface{ ....

includeステートメントを使用すると、エラーは発生しません。 useステートメントを試すと、次のようになります。

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

誰かが問題について少しアドバイスをください。

101
Shawn Northrop

use operator は、クラス、インターフェース、または他の名前空間の名前にエイリアスを与えるためのものです。ほとんどの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演算子を autoloading と混同しないでください。クラスは、オートローダーを登録することで(たとえばspl_autoload_registerを使用して)自動ロードされます(includeの必要性がなくなります)。適切なオートローダーの実装を確認するには、 PSR-4 と読みたいかもしれません。

154
cmbuckley

コードを名前空間に並べる必要がある場合は、キーワードnamespaceを使用します。

file1.php

namespace foo\bar;

File2.phpで

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

useを使用することもできます。 file2に置く場合

use foo\bar as mypath;

ファイル内のどこでもmypathの代わりにbarを使用する必要があります。

$obj  = new mypath\myObj();

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

9
Charlie H