在PHP中作为非字符串参数的类

Example in file 1:

namespace A;

class Foo{

}

file 2:

use A\Foo;

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

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

Is there any way I can pass class names in function arguments like constants or something, so I don't need to prepend the namespace?

Update :)

When I know, that I need to pass the classnames of some classes around as string I'm used to create special class constant

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

Now you can reference the classname like

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

With PHP5.5 this will be builtin

echo Baz::class;

Full-Qualified-Names (FQN) for namespaces always starts with a namespace separator

do_stuff('\A\Foo');

except (and thats the only exception) in use-statements, because there can only appear complete namespace identifiers, so for convenience you can omit it there.

However, a string is a string and where you use it as a class name is out of scope of the interpreter, so it lost the reference to the former use A\Foo-aliasing. With PHP5.5 you can write Foo::class, but I think thats not an option right now ;)

No, not without tracing the caller, as far as I know. The function you are calling must exists within the same namespace as the object you are trying to pass.

You might want to have a look at the debug_backtrace function if you require the namespace resolution. But this requires the file-paths to be translated into namespace resolutions or similar.

This is however possible: (I see Andrew has answered with the same type of solution.)

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");

You could instantiate a new object, then call get_class() to get the fully qualified name for the class.

use A\Foo;

$foo = new Foo();

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

This means that the namespace of Foo is only defined by the use statement (ie. less code maintenance).

Or you can pass class reflection.

ReflectionClass