【问题标题】:PHP Constructor Not Called Upon Instantiation [closed]实例化时未调用 PHP 构造函数 [关闭]
【发布时间】:2012-02-02 18:10:27
【问题描述】:

在启动类时,我的 PHP 类构造函数似乎没有被调用。这是我的构造函数的样子:

public function __contruct()
{
  $GLOBALS['page_content'] .= "<p>Constructor entered.</p>\r\n";

  try
  {
    $this->ConstructorBase();
  }
  catch ( Exception $e )
  {
    throw new Exception(
      "Error in ".__FILE__."(".__LINE__."): Constructor failed.",
      CLoginError::ERROR_CANNOT_INSTANTIATE, $e );
  }
}

稍后在同一个文件中,在全局范围内,我尝试实例化该类:

$Login = new CLogin();

但是,当我检查$GLOBALS['page_content'] 时,在实例化该类之后,它是空的,就好像从未调用过构造函数一样。奇怪的是我可以调用公共成员函数。如果你想看,完整的源代码在这里发布:

http://pastebin.com/D95YnUmS

【问题讨论】:

  • 构造函数中的 GLOBALS 和异常也是不好的做法
  • 异常在构造函数中根本不是坏习惯,实际上在任何情况下都建议使用 trigger_error 并且是捕获创建对象时发生的错误的唯一有效机制。我同意虽然在 GLOBALS 上,但不要在任何地方使用 GLOBALS……不好的坏习惯。
  • 构造函数通常应该只有变量声明。剩下的就看方法了。
  • 我使用 GLOBALS 只是为了调试目的,因为我需要知道它是否正在进入构造函数而不破坏其他任何东西。感谢大家的帮助!
  • 旁注:阅读“SQL 注入”和“准备好的语句”。

标签: php oop constructor


【解决方案1】:

你将你的函数命名为__contruct(),它应该是__con<strong>s</strong>truct()。这是一个很常见的错误,你应该睡一会儿。

【讨论】:

  • 想想这个“错字”让我在过去的 3 周里一直卡住。 ^_^;;我想我会称它为来自地狱的错字。活到老,学到老。谢谢你的帮助。很高兴再次前进,至少在这个过程中我学到了很多关于调试PHP的知识。
  • 是的,如果一个函数没有在它应该调用的时候被调用(在对象实例化或常规函数调用中),假设没有记录错误,很可能你只是输入错误的函数名称(在调用或函数声明中)。祝你下次好运:D
  • 刚刚花了将近 5 分钟盯着上面的那两个,想知道......有什么不同。如果你现在和我一样筋疲力尽,第一个是缺少s
  • 我刚刚花了 2 个小时来了解我已经知道的关于 OOP 的知识,以解决这个问题。 +1
  • @Julian:获得更好的 IDE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2013-11-05
  • 2016-08-29
  • 1970-01-01
相关资源
最近更新 更多