2

我有一些这样设置的类,其中 -> 表示“扩展”:

DBObject -> Article -> Activity

DBObject包含一个泛型__construct,可以轻松地从数据库中加载我的对象(因此DataBaseObject)。

Article覆盖 this __construct,用于一些特殊的构造函数行为。

Activity不实现 any __construct,因为它可以由它的超类' __construct( Article::__construct) 处理。

但是,由于某种原因,如果我打电话

$activity = new Activity($args);

它以 结尾DBObject::__construct,并一起通过了 Article 的。我一直认为对子类的调用应该一次一个类地沿着子类线路上行。我这样想错了吗?

编辑:这是一个代码片段: 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 对其进行初始化;只有当我使用数组new以外的东西调用 DBObject 的子类时,才会发生这种情况。null但是,由于 Article 应该覆盖 __construct,所以应该首先调用它。

4

1 回答 1

2

您的理解是正确的:使用您描述的设置创建一个新的Activity肯定会“推迟”到Article::__construct. 如果没有,那么您的描述和实际代码必须有所不同。PHP 有相当多的错误,但这是一个非常简单的场景,可以将令人惊讶的行为归因于错误代码。

如果您仍然认为代码没有问题,请在显示问题的在线键盘(如 htpp://ideone.com)上发布工作示例。

于 2012-10-22T10:40:22.100 回答