所以我正在重构我的代码来实现更多的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()
那么我错过了什么?
答案 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()。现在工作正常。