【发布时间】:2012-10-22 10:36:26
【问题描述】:
我有一些这样设置的类,其中 -> 表示“扩展”:
DBObject -> Article -> Activity
DBObject 包含一个通用的__construct 可以轻松地从数据库中加载我的对象(因此是DataBaseObject)。
Article 覆盖这个__construct,用于一些特殊的构造函数行为。
Activity 没有实现任何__construct,因为它可以由其超类'__construct (Article::__construct) 处理。
但是,由于某种原因,如果我打电话
$activity = new Activity($args);
它以DBObject::__construct 结尾,并一起通过了Article 的。我一直认为对子类的调用应该一次一个类地沿着子类线路上行。我这样想错了吗?
编辑:这是代码 sn-p:http://pastebin.com/SXpSNVMm。我删除了所有不必要的代码。我这样称呼它:
$userId = 60;
$title = "TestTitle";
$contents = "Lorem ipsum dolor sit amet";
$date = 1356173771;
echo "creating new activity\n";
$a = new Activity($userId, $title, $contents, $date);
在构造函数中放置 echo 表明 Article::__construct() 未被使用,它直接转到 DBObject::__construct()。
编辑 2:这是一个应该可以正常工作的版本:http://ideone.com/VJzdI3。我正在使用 PHPUnit 进行测试。如果我使用 PHPUnit 运行,这是输出:
creating new activity
DBObject constructed called
QUERY: 60 ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '60' at line 1
后者意味着它正在尝试使用 meekrodb 对其进行初始化;只有当我在 DBObject 的子类上调用new 时才使用null 或数组以外的东西,这种情况才会发生。但是,由于 Article 应该覆盖 __construct,所以应该首先调用它。
【问题讨论】:
-
给我们看一些代码。您可能正在扩展 DBObject 而不是 Article。
-
$this->fromArray($newInfo)最后缺少分号,你确定你复制了你说的代码不起作用吗?这也行不通,因为您在静态方法中使用$this。此外,如果您希望call_user_func_array('newPost', $args);调用对象的方法 - 它不会。array($this, 'newPost')会这样做。