Home  >  Article  >  Backend Development  >  PHP动态创建对象的问题

PHP动态创建对象的问题

WBOY
WBOYOriginal
2016-06-06 20:21:271330browse

<code>namespace A\B;

//Test的命名空间也是A\B
include_once('Test.php');

//这个也是可行的,不带命名空间
$obj = new Test();

//这个就不可行,报错,找不到Test
$this->name = 'Test';
$obj = new $this->name();

//这个是可行的,带上命令空间即可
$this->name = 'Test';
$className = '\A\B\\' . $this->name;
$obj = new $className();</code>

已经找到答案。见回答

回复内容:

<code>namespace A\B;

//Test的命名空间也是A\B
include_once('Test.php');

//这个也是可行的,不带命名空间
$obj = new Test();

//这个就不可行,报错,找不到Test
$this->name = 'Test';
$obj = new $this->name();

//这个是可行的,带上命令空间即可
$this->name = 'Test';
$className = '\A\B\\' . $this->name;
$obj = new $className();</code>

已经找到答案。见回答

导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。

<code><?php use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a;      // 实际化一个 Another 对象
?></code>

在编译的时候new Another;=>new My\Full\Classname
但是动态的没有被编译转成上面的情况,所以会提示找不到类。
__NAMESPACE__配合即可解决这个问题。

<code><?php use namespacenamea\A;
use namespacenameb\B;
use namespacenamec\C;

class factory
{

//动态实例化的时候,都要自己拼上命名空间??那头部的use岂不作废了???
public function getObj($num) {
        $A = 'A';
        $B = 'B';
        $C = 'C';
        $obj = '';
        switch($num) {
            case 1:
                $obj = new $A;//这是错误的写法,会找不到类
                break;
            case 2:
                $obj = new $B;//这是错误的写法,会找不到类
                break;
            case 3:
                $obj = new $C;//这是错误的写法,会找不到类
                break;
        }
    }
}
?>  

动态实例化的时候,都要自己拼上命名空间??那头部的use岂不作废了???
拼上命名空间的方法的确有用,但是有没有别的更好的办法呢? </code>
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn