2012-05-10 15 views
82

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

私は3つのファイル:ShapeInterface.php,Shape.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ステートメントしようとした場合:

Fatal error: Class 'Shape\Shape' not found in /Users/shawn/Documents/work/sites/workspace/shape/Circle.php on line 8

を誰かが私の問題にはほとんど指導をお願いしてもらえますか?

+0

に等しいuse foo\bar言っていた場合。外部ファイルは使用に含められますか? –

+0

またこの件に関して - http:// stackoverflow。com/questions/33341955/import-or-use-order-affected-functionality-in-php – Peter

答えて

124

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をお読みください。あなただけのキーワードnamespaceを使用し、名前空間の中で、あなたのコードを注文する必要がある場合は

+0

恐ろしいことに、それをチェックしてください。ありがとう! –

+0

私はbootstrap.phpと呼ばれる別のファイルを作成し、$ circle = new Circle();と一緒にオートローダを配置します。 Circle.phpが含まれていますが、エラーが発生しています:致命的なエラー:クラス 'Shape'が.../Circle.phpに見つかりませんでした。Circle.phpがロードされているように見えますが、Shape.phpはロードされていませんCircle is defined次のように:class Circle extends ShapeはShapeInterfaceを実装します –

+0

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

4

最も簡単な方法は、それ

を配置します。 file2.php $obj = new foo\bar\myObj();


file1.phpで

namespace foo\bar;

この話にはまだもう少し - useキーワード。

ファイル2で言う場合、use foo\bar as mypathこれはファイル内のどこでもfoo\barの代わりにmypathを使用する必要があることを意味します。

$obj = new mypath\myObj(); 

あなたは私がこれを読んで、まだかなりそれを得ることはありませんuse foo\bar as bar

関連する問題