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

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

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() для не-объекта

Итак, что мне не хватает?

Ответ 1

Это означает, что $objPage не является экземпляром объекта. Можем ли мы увидеть код, который вы использовали для инициализации переменной?

Как вы ожидаете, определенный тип объекта, вы также можете использовать функцию подсказки типов PHP Docs для получить ошибку, когда ваша логика нарушена:

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

Эта функция принимает только PageAtrributes для первого параметра.

Ответ 2

Там есть простой способ произвести эту ошибку:

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

Выведет ошибку:

Неустранимая ошибка: вызов функции-члена anything() для не-объекта в /Applications/XAMPP/xamppfiles/htdocs/casMail/dao/server.php в строке 23

Было бы намного лучше, если бы PHP просто сказал:

Неустранимая ошибка: вызов из Joe не определен, потому что (a) joe равно null или (b) joe не определяет anything() в строке ## > .

Обычно вы создаете свой класс, чтобы $joe не был определен в конструкторе или

Ответ 3

Либо $objPage не является переменной экземпляра, либо вы переписываете $objPage чем-то, что не является экземпляром класса PageAttributes.

Ответ 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.

Ответ 5

Вместо передачи объекта в качестве параметра вы можете объявить объект глобальным в page_properties.

$objPage = new PageAtrributes;

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

Ответ 6

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

выглядит как разные имена переменных $objPortal vs $objPage

Ответ 7

вы можете использовать функцию "use" в функции, подобной приведенной ниже.

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

Ответ 8

Я понял, что не прошел $objPage в page_properties(). Теперь он отлично работает.