PHP子类不调用其父类构造

时间:2012-10-22 10:36:26

标签: php oop

我设置了一些类,其中 - >意思是'延伸':

DBObject -> Article -> Activity

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

对于某些专门的构造函数行为,

Article会覆盖此__construct

Activity未实现任何__construct,因为它可由其超类“__constructArticle::__construct)处理。

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

$activity = new Activity($args);

最终以DBObject::__construct结尾,并将Article's全部传递到一起。我一直认为对子类的调用应该一次向一个类传递子类行。我错误地想到了吗?

编辑:这是一段代码: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,因此应首先调用那个。

1 个答案:

答案 0 :(得分:2)

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

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