Вызов функции-члена без объекта [дубликат]
этот вопрос уже есть ответ здесь:
Ссылка - Что означает эта ошибка в 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() на не-объект
Так чего же мне не хватает?
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']); }
Comments