Php 这是什么意思:$foo=new$foo();?
我以前从未见过这样的事情Php 这是什么意思:$foo=new$foo();?,php,Php,我以前从未见过这样的事情 $dbTable = new $dbTable(); 我们正在$dbTable中存储一个对象实例? 我们正在将字符串转换为对象吗? 以下是上下文: protected $_dbTable; public function setDbTable($dbTable) { if (is_string($dbTable)) { $dbTable = new $dbTable(); } i
$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手册:
我们可以阅读:
如果一个字符串包含
类与新实例一起使用
将创建该类的。如果
类位于命名空间中,其
执行此操作时必须使用限定名称
这个
但这似乎是字符串和那些“东西”(things)之间的串联操作:()——不使用点。所以我仍然不确定这里发生了什么。不,行:
if (is_string($dbTable)) {
表示仅当输入为字符串时,才会实例化新的$dbTable
。所以这里发生的事情是,$dbTable
包含在代码执行时创建的类的名称:
$dbTable = new $dbTable();
然后,代码检查以确保创建了正确类型的对象(
Zend\u Db\u Table\u Abstract
)。正如Stefan指出的那样,类的实例可以直接传递,在这种情况下,您提到的代码甚至不会执行。该方法要么将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()
语法允许您从运行时确定的类实例化对象 我相信,它的作用是——它从类中创建新对象,其名称存储在$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'
所以,当我们有$dbTable()
;$dbTable是一个类表示字符串,我们将()
与该字符串“连接”,以便$dbTable()代码>保持等于myClass()代码>?如果是这样的话,我不明白为什么我们不使用圆点sIt不是串联,而是“可变变量”——嗯。。。我不确定。在阅读了您的源代码之后,我注意到我们可以很好地得到以下内容:${a.$I}=“value”这里,我们有一个点,它会起作用。当然,我们也可以忘记圆点。但是,出于某种原因,php接受了点(:)类_exists()将比is_stirng()更好。@smentek:除了那是完全不同的函数。@smentek:我认为在这种情况下不是。因为我们只能传递一个字符串。还是我错了?很好!我明白了。因此,这可能就是作者首先添加is_字符串条件,并创建另一个条件以查看该对象是否是某个对象的实例的原因。如果我们有一个字符串,它将抓取该字符串,并将其转换为一个对象,然后检查其类型是否正确。如果我们有一个对象,它只会做后面的事情。是吗?@MEM:完全正确。这就是给定代码的意图。非常感谢。请保留您的答案,因为我发现理解这背后的概念很有用。:)