PHP 子类不调用其父类构造

标签 php oop

我有一些类设置如下,其中 -> 表示“扩展”:

DBObject -> Article -> Activity

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

对于某些特殊的构造函数行为,

Article 会覆盖此__construct

Activity 不实现任何 __construct,因为它可以由其父类(super class)'__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 对其进行初始化;仅当我使用 null 或数组以外的其他内容对 DBObject 的子类调用 new 时,才会发生这种情况。然而,由于 Article 应该重写 __construct,所以应该首先调用它。

最佳答案

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

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

关于PHP 子类不调用其父类构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13009613/

相关文章:

php - 从 txt 文件 PHP 获取数据(用户选择的字长)后显示字

PHP 在没有数据库查询的情况下执行 SQL LIKE 匹配的方法?

php - 加快 MYSQL LARGE 查询速度

php - 如何在登录查询中检查哈希和盐?

javascript - laravel ajax 表单不会执行提交按钮

php - Laravel URL 在子文件夹中不起作用

c++ - 根据实例数自动设置ID

java - 返回并打印字段值或仅通过类方法打印值?

javascript - 使用 Array.map (TypeScript) 返回通用数组

java - 无限递归组合类