这是什么意思:$foo = 新的 $foo();


What does this mean: $foo = new $foo();?

我以前从未见过这样的东西。

$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

我们可以阅读:

如果字符串包含 类与新实例一起使用 将创建该类。如果 类位于命名空间中,其完全 执行时必须使用限定名 这。

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

不,行:

if (is_string($dbTable)) {

意味着仅当输入为字符串时,才会实例化新$dbTable。所以这里发生的事情是$dbTable包含执行该代码时创建的类的名称:

$dbTable = new $dbTable();

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

我相信

,它的作用是 - 它从类创建新对象,名称存储在$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'
该方法

要么将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()语法允许您实例化运行时确定的类中的对象。