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