0

ファイル1の例:

namespace A;

class Foo{

}

ファイル2:

use A\Foo;

do_stuff('A\Foo');  // <- need namespace here :(

Foo::someStaticMethod();  // <- namespace not required :D

定数などの関数の引数でクラス名を渡す方法はありますか?名前空間の前に付ける必要はありませんか?

4

4 に答える 4

2

アップデート :)

私が知っているとき、私はいくつかのクラスのクラス名を文字列として渡す必要があることを知っています私は特別なクラス定数を作成するために使用されます

namespace Foo\Bar;
class A {
    const __NAMESPACE = __NAMESPACE__;
    const __CLASS = __CLASS__;
}

これで、次のようなクラス名を参照できます。

use Foo\Bar\A as Baz;
echo Baz::__CLASS;

PHP5.5では、これが組み込まれます

echo Baz::class;

名前空間の完全修飾名(FQN)は、常に名前空間区切り文字で始まります

do_stuff('\A\Foo');

-ステートメントの例外(そしてそれが唯一の例外)。use完全な名前空間識別子しか表示できないため、便宜上、ここでは省略できます。

ただし、文字列は文字列であり、クラス名として使用する場所はインタプリタの範囲外であるため、前者のuse A\Fooエイリアシングへの参照が失われます。PHP5.5で書くことができますがFoo::class、今のところそれはオプションではないと思います;)

于 2013-01-11T13:34:04.683 に答える
1

いいえ、私が知る限り、発信者を追跡することなくではありません。呼び出す関数は、渡そうとしているオブジェクトと同じ名前空間内に存在する必要があります。

debug_backtrace名前空間の解決が必要な場合は、関数を確認することをお勧めします。ただし、これには、ファイルパスを名前空間の解像度などに変換する必要があります。

ただし、これは可能です:(アンドリューが同じタイプの解決策で答えたようです。)

function doStuff ($obj)
{
    $name = (is_object($obj))
        ? (new ReflectionClass(get_class($obj)))->getName()
        : $obj;

    // $name will now contain the fully qualified name
}


namespace Common;

class Test
{}

$testObj = new Test();

// This will work, but requires argument to be
// fully quialified or an instance of the object.
\doStuff($testObj);
\doStuff("\Common\Test");
于 2013-01-11T13:35:52.163 に答える
1

新しいオブジェクトをインスタンス化してから、get_class()を呼び出して、クラスの完全修飾名を取得できます。

use A\Foo;

$foo = new Foo();

do_stuff(get_class($foo));  // get_class($foo) = '\A\Foo'

これは、Fooの名前空間がuseステートメントによってのみ定義されることを意味します(つまり、コードのメンテナンスが少なくなります)。

于 2013-01-11T13:51:49.657 に答える
1

または、クラスリフレクションを渡すことができます。

ReflectionClass

于 2013-01-11T14:36:42.137 に答える