调用非对象上的成员函数

时间:2008-09-10 16:19:57

标签: php

所以我正在重构我的代码来实现更多的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()

那么我错过了什么?

8 个答案:

答案 0 :(得分:43)

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

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

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

此功能仅接受PageAtrributes作为第一个参数。

答案 1 :(得分:35)

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

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

将呈现错误:

  

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

如果 PHP 只会说,

会更好
  

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

通常你已经构建了你的类,因此在构造函数或

中没有定义$joe

答案 2 :(得分:7)

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

答案 3 :(得分: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.

答案 4 :(得分:2)

我推荐上面接受的答案。但是,如果您处于紧张状态,则可以将对象声明为 page_properties 函数中的全局对象。

$objPage = new PageAtrributes;

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

答案 5 :(得分:1)

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

看起来像变量$ objPortal vs $ objPage

的不同名称

答案 6 :(得分:0)

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

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

答案 7 :(得分:-1)

我意识到我没有将 $ objPage 传递到 page_properties()。现在工作正常。