【问题标题】:PHP subclass not calling its parents constructPHP 子类没有调用它的父类构造
【发布时间】: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') 会这样做。

标签: php oop


【解决方案1】:

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

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

【讨论】:

  • 我用附加信息编辑了我的帖子。因为我很确定我的代码是正确的,所以我首先想检查我的推理是否存在根本缺陷。
  • @ErikDolor:该代码未上线,请花点时间制作。
  • 好吧,我吃完早餐,我把半工作版上线。这是一个经过编辑的版本。
  • 添加了一个新版本,其中仅省略了最少量的其他代码。
  • @ErikDolor:我移动了一点代码让它运行,it works as it should
猜你喜欢
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2015-04-24
相关资源
最近更新 更多