这是什么意思:$ foo = new $ foo();?

时间:2011-05-08 12:32:19

标签: php

我以前从未见过这样的事情。

$dbTable = new $dbTable();

我们在$ dbTable中存储了一个对象实例?

我们是否正在将字符串转换为对象?

以下是上下文:

protected $_dbTable;

    public function setDbTable($dbTable)
    {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided');
        }
        $this->_dbTable = $dbTable;
        return $this;
    }

来自php手册: http://www.php.net/manual/en/language.oop5.basic.php

我们可以阅读:

  

如果是包含名称的字符串   class与new,一个新实例一起使用   将创建该类。如果   class在命名空间中,完全是   这样做时必须使用限定名称   此

但这似乎是字符串和那些“事物”之间的串联操作:() - 不使用点。所以我仍然不确定这里发生了什么。

3 个答案:

答案 0 :(得分:7)

不,行:

if (is_string($dbTable)) {

表示如果输入是字符串,则只会实例化新的$dbTable。所以这里发生的是$dbTable包含在代码执行时创建的类的名称:

$dbTable = new $dbTable();

然后在代码检查中确保创建了正确类型(Zend_Db_Table_Abstract)的对象。正如Stefan指出的那样,可以直接传递类的实例,在这种情况下,你提到的代码甚至都没有执行。

答案 1 :(得分:3)

我相信,这是做什么的 - 它从类中创建新对象,名称存储在$dbTable

<?php

class MyClass {
    private $foo = 4;

    public function bar(){
        echo $this->foo;
    }
}

class MyClass2 {
    private $foo = 6;

    public function bar(){
        echo $this->foo;
    }
}

$a = 'MyClass';
$b = new $a();
$b->bar(); //echo '4'

$a = 'MyClass2';
$b = new $a();
$b->bar(); //echo '6'

答案 2 :(得分:1)

该方法要么将Zend_Db_Table_Abstract(或子类)的实例作为参数,要么使用带有要实例化的类名称的字符串参数。

所以基本上这允许你调用这样的方法:

$dbTable = new My_Zend_Db_Table_Class();
$xy->setDbTable($dbTable);

// or

$dbTable = 'My_Zend_Db_Table_Class';
$xy->setDbTable($dbTable);

后者仅在您的自定义类不接受任何构造函数参数时才有效。

$obj = new $className()语法允许您从运行时确定的类中实例化对象。