Вызов функции-члена для необъекта
Поэтому я реорганизую свой код, чтобы реализовать больше ООП. Я установил класс для хранения атрибутов страницы.
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 ответов
Это означает, что $objPage
не является экземпляром объекта. Можем ли мы увидеть код, который вы использовали для инициализации переменной?
Поскольку вы ожидаете определенного типа объекта, вы также можете использовать PHP- документацию с функцией подсказки типов, чтобы получить ошибку при нарушении вашей логики:
function page_properties(PageAtrributes $objPortal) {
...
$objPage->set_page_title($myrow['title']);
}
Эта функция будет принимать только PageAtrributes
для первого параметра.
Есть простой способ вызвать эту ошибку:
$joe = null;
$joe->anything();
Выдаст ошибку:
Неустранимая ошибка: вызов функции-члена
anything()
для необъекта в /Applications/XAMPP/xamppfiles/htdocs/casMail/dao/server.php в строке 23
Было бы намного лучше, если бы PHP просто сказал:
Неустранимая ошибка: вызов от Джо не определен, потому что (а) Джо равен нулю или (б) Джо не определяет
anything()
в строке <##>.
Обычно вы строите свой класс так, чтобы $joe
не определен в конструкторе или
Или $objPage
не является переменной экземпляра ИЛИ вы перезаписываете $objPage
с чем-то, что не является экземпляром класса PageAttributes
,
Это также может означать, что когда вы инициализировали свой объект, вы могли повторно использовать имя объекта в другой части вашего кода. Поэтому, изменяя его аспект с объекта на стандартную переменную.
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.
function page_properties($objPortal) {
$objPage->set_page_title($myrow['title']);
}
выглядит как разные имена переменных $objPortal vs $objPage
Я рекомендую принятый ответ выше. Однако, если вы в затруднении, вы можете объявить объект глобальным в функции page_properties.
$objPage = new PageAtrributes;
function page_properties() {
global $objPage;
$objPage->set_page_title($myrow['title']);
}
Я понял, что не передаю $objPage в page_properties (). Теперь работает нормально.
Вы можете использовать "использовать" в функции, как показано ниже
function page_properties($objPortal) use($objPage){
$objPage->set_page_title($myrow['title']);
}