Вызов функции-члена для необъекта

Поэтому я реорганизую свой код, чтобы реализовать больше ООП. Я установил класс для хранения атрибутов страницы.

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']);
}
Другие вопросы по тегам