【问题标题】:Call to a member function on a non-object [duplicate]调用非对象上的成员函数[重复]
【发布时间】:2010-09-08 10:44:54
【问题描述】:

所以我正在重构我的代码以实现更多的 OOP。我设置了一个类来保存页面属性。

class PageAtrributes 
{
  private $db_connection;
  private $page_title;

    public function __construct($db_connection) 
    {
        $this->db_connection = $db_connection;
        $this->page_title = '';
    }

    public function get_page_title()
    {
        return $this->page_title;
    }

    public function set_page_title($page_title)
    {
        $this->page_title = $page_title;
    }
}

稍后我像这样调用 set_page_title() 函数

function page_properties($objPortal) {    
    $objPage->set_page_title($myrow['title']);
}

当我收到错误消息时:

在非对象上调用成员函数 set_page_title()

那么我错过了什么?

【问题讨论】:

  • 那个 objPage 不引用 PageAtrributes 对象的实例(或者实际上,任何对象)。在上一行尝试 var_dump 看看它实际上是什么。
  • 首先,创建一个类的实例,其次,定义它: $new_instance = new Class();然后将其定向到您的方法,例如: $new_instance->set_page_title('MyNewTitle');

标签: php


【解决方案1】:

这意味着$objPage 不是对象的实例。我们可以看看你用来初始化变量的代码吗?

由于您期望特定的对象类型,您也可以在违反逻辑时使用PHPs type-hinting featureDocs 来获取错误:

function page_properties(PageAtrributes $objPortal) {    
    ...
    $objPage->set_page_title($myrow['title']);
}

这个函数只接受PageAtrributes作为第一个参数。

【讨论】:

    【解决方案2】:

    有一个简单的方法可以产生这个错误:

        $joe = null;
        $joe->anything();
    

    将呈现错误:

    致命错误:在第 23 行的 /Applications/XAMPP/xamppfiles/htdocs/casMail/dao/server.php 中的非对象上调用成员函数 anything()

    如果PHP只是说,会好很多,

    致命错误:未定义来自 Joe 的调用,因为 (a) joe 为 null 或 (b) joe 未在 行中定义 anything()

    通常你已经构建了你的类,所以$joe没有在构造函数中定义或者

    【讨论】:

    • 那又怎样,我今天来找这个。大卫写的关于重现这个错误的内容证实了我的猜测,否则我需要测试。 :)
    • 感谢大卫的解释。这对我来说比上面的答案更有帮助,因为它用更简单的语言解释了事情,这使我可以自己进一步调查事情,而不必创建一个具有相同问题的新线程,因为上面的答案对我仍然没有帮助.
    【解决方案3】:

    $objPage 不是实例变量,或者您正在用不是类PageAttributes 的实例覆盖$objPage

    【讨论】:

      【解决方案4】:

      这也可能意味着当您初始化对象时,您可能在代码的另一部分重新使用了对象名称。因此将它的方面从对象更改为标准变量。

      IE

      $game = new game;
      
      $game->doGameStuff($gameReturn);
      
      foreach($gameArray as $game)
      {
         $game['STUFF']; // No longer an object and is now a standard variable pointer for $game.
      }
      
      
      
      $game->doGameStuff($gameReturn);  // Wont work because $game is declared as a standard variable.  You need to be careful when using common variable names and were they are declared in your code.
      

      【讨论】:

        【解决方案5】:
        function page_properties($objPortal) {    
            $objPage->set_page_title($myrow['title']);
        }
        

        看起来像 $objPortal 和 $objPage 的变量名称不同

        【讨论】:

          【解决方案6】:

          我推荐上面接受的答案。但是,如果您处于紧要关头,您可以在 page_properties 函数中将该对象声明为全局对象。

          $objPage = new PageAtrributes;
          
          function page_properties() {
              global $objPage;
              $objPage->set_page_title($myrow['title']);
          }
          

          【讨论】:

          • 我今天才知道...... OMG。与java非常不同。
          • 是的...我也忘记了
          • -1:这是最糟糕的可能的解决方案
          • @tereško,您能否详细说明为什么这是不好的做法?
          • @MattClark 因为它依赖于全局状态的使用。
          【解决方案7】:

          我意识到我没有将 $objPage 传递给 page_properties()。现在可以正常使用了。

          【讨论】:

            【解决方案8】:

            你可以在下面的例子中使用'use'

            function page_properties($objPortal) use($objPage){    
                $objPage->set_page_title($myrow['title']);
            }
            

            【讨论】:

              猜你喜欢
              • 2016-01-01
              • 1970-01-01
              • 2011-05-28
              • 2014-06-05
              • 2015-05-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多