调用一个非对象的成员函数
所以我重构我的代码来实现更多的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() 。 现在工作正常。