2012-04-09 11 views
1

私は、これはbugwrong implementationであるかどうかを知りたいでしょう.....場合class_existPHPクラスの奇妙な行動

私のクラス

namespace servers\testing ; 

class HelloWord 
{ 
    function hello() 
    { 
     echo "hello World" ; 
    } 
} 

テスト

use servers\testing\HelloWord as OkWorld ; 

$okWolrd = new OkWorld() ; 
$helloWorld = new \servers\testing\HelloWord() ; 

var_dump($okWolrd); //object(servers\testing\HelloWord)[1] 
var_dump(class_exists('servers\testing\HelloWord')); //true 
var_dump(class_exists('OkWorld')); //false 


$declearedClasses = get_declared_classes() ; 

var_dump(in_array('servers\testing\HelloWord', $declearedClasses)); //true 
var_dump(in_array('OkWorld', $declearedClasses)); //false 


var_dump($okWolrd instanceof $helloWorld); //true but OkWolrd needed to be initiated before it works 
をチェックしてみています

質問

OkWord有効なPHPクラスではありませんか? new OkWorld()が正常に動作することに注意してください。

OkWordが減速なしで存在することをどのように確認しますか?

編集1つの

私はOkWorldaliasが、有効なクラスがあるservers\testing\HelloWordへの参照であることを知っている...

おかげ

+1

いずれかが否定的な投票をしている場合は、その理由のコメントに感謝します。ありがとうございます – Baba

答えて

3

私はそれはバグや間違った実装でもないと思います。

OKWorldはクラスではありません。エイリアスです。インタープリタは、存在する場合は常にHelloWordに置き換えます。しかし、インタプリタは文字列を検索しないので、関数class_existsは文字列OKWorldを取得し、実際には存在しない対応するクラスを検索します。実際に存在するものはエイリアスです。

0

OkWorldはクラスではありません。これは名前空間のエイリアスです。実際のクラスはです。 OkWorldはエイリアスではなく、実際のクラスであるためOkWorldクラスであるかどうかをチェックするためにfalseを返す

+1

私は知っています...問題は、そのエイリアスが存在するかどうかを検証する方法です。有効なクラスとして扱われています。 – Baba

+0

@Baba:エイリアスが存在するかどうかテストしたいのですが?あなたは何を達成しようとしていますか? AFAIKこれは、反射を使用してのみ行うことができます。 – FtDRbwLXw6

+0

イメージングでは、ユーザーがクラスをリモートで指す必要があるRESTサービスがあります...名前空間を置く必要がなく、エイリアスを使用するクリーナー... ...別の例では、開発してオートロードする場合クラス化され、エイリアスがフルパスの代わりに使用されます。何が起こるか – Baba

2

は有効です。代わりにinstanceofを使用して試すことができます:

// Not sure if this works (haven't used namespace aliases yet) 
//var_dump('OkWorld' instanceof HelloWorld); // No GOOD - Throws fatal 

// This will work 
$okWorld = new OkWorld(); 
var_dump($okWorld instanceof HelloWorld); 
+0

私は 'エイリアス'だと同意しますが、あなたのコードは 'OKWord'と起動される場合にのみ有効です – Baba

+0

@Baba:ありがとう、それを捕らえて更新しました。 –

+0

@MikePurcellは最初に致命的なものを投げます(instanceofはインスタンスを期待します) – poncha