我偶然发现了这一点,想知道这是否是预期的行为:
Interactive shell
php > class dog {
php { public $name='doggy';
php { public function speak() {
php { echo "bark, bark! (my name is " . $this->name . ")\n";
php { }
php { }
php >
php > $puppy = new dog;
php > $puppy->speak();
bark, bark! (my name is doggy)
php >
php > $taffy = new $puppy;
php > $taffy->speak();
bark, bark! (my name is doggy)
php >
php > $taffy->name = "Taffy";
php > $taffy->speak();
bark, bark! (my name is Taffy)
php >
php > $puppy->speak();
bark, bark! (my name is doggy)
php >
我的问题是关于这条线的$taffy = new $puppy;
通常情况下,我会编码$taffy = new dog;
我没想到能够通过实例化来创建新对象......如果这有意义的话。
这是预期的功能,还是只是一个意外的惊喜?
我在构建需要与多个不同数据库表通信的模型时发现了这一点,并且我使用依赖项注入来传递数据库抽象:
class ShowConnectedTables {
public function __constructor($db) {
$this->modelOne = new ModelOne($db);
$this->modelTwo = new ModelTwo($db);
}
// ... snip ...
}
$table = new ShowConnectedTables(new Database);
但有时,在获取 ModelOne 行的循环中间对 ModelTwo 的数据库调用可能会破坏 ModelOne 行的获取。那么是否可以接受
class ShowConnectedTables {
public function __constructor($db) {
$this->modelOne = new ModelOne($db);
$this->modelTwo = new ModelTwo(new $db); // note new abstraction
}
// ... snip ...
}
$table = new ShowConnectedTables(new Database);