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



этот вопрос уже есть ответ здесь:




  • Ссылка - Что означает эта ошибка в PHP?

    31 ответы



поэтому я рефакторинг моего кода для реализации более ООП. Я настроил класс для хранения атрибутов страницы.



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




Так чего же мне не хватает?

318   8  
PHP

8 ответов:

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

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

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 on line 23

было бы намного лучше, если бы PHP говорю:

фатальная ошибка: вызов от Джо не определен, потому что (A) Джо равен нулю или (b) Джо не определяет anything() in на линии.>##

как правило, вы должны построить свой класс, так что $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 вместо $objPage

Я рекомендую принятый ответ выше. Если вы находитесь в крайнем случае, однако, вы можете объявить объект как глобальный в page_properties.

$objPage = new PageAtrributes;

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

вы можете использовать "использовать" в функции, как ниже пример

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

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

Comments

    Ничего не найдено.