调用一个非对象的成员函数

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

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不是一个对象的实例。 我们可以看到你用来初始化variables的代码吗?

如您期望的特定对象types,您还可以使用PHPtypes提示functionDocs在违反逻辑时获取错误:

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

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

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

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

会呈现错误:

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

如果PHP只是说,这将会好得多,

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

通常你有build立你的类,所以$joe没有在构造函数中定义

$objPage不是一个实例variables,或者您正在用不是PageAttributes的实例的某个东西来覆盖$objPage

这也可能意味着当你初始化你的对象时,你可能已经在你的代码的另一部分重新使用了对象名称。 因此,把它从一个对象变成一个标准variables。

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. 

而不是将对象作为parameter passing,您可以在page_properties函数中将该对象声明为全局对象。

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

看起来像variables的不同名称$ objPortal vs $ objPage

你可以像下面的例子那样在函数中使用'use'

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

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