Intereting Posts
Ведение журнала swiftmailer send () в symfony2 Авторизованные приложения GAE должны находиться в том же регионе, что и экземпляр базы данных | Google App engine PHP tmpfile () возвращает false найти параметры в url, используя php Сортировка многомерного массива на основе другого массива Удаление не буквенно-цифровых символов из строки Как лучше всего преобразовать данные формы выбора даты CakePHP в объект PHP DateTime? Как предотвратить повторное замещение вторым регулярным выражением? Laravel защищает файлы Amazon s3 bucket Как получить доступ к PHP-методам внутри Javascript? Почему этот вызов PHP для json_encode бесшумно терпит неудачу – неспособность обрабатывать одиночные кавычки? Удалить несколько строк с PDO и флажками с помощью подготовленных операторов? preg_match: проверить формат дня рождения (дд / мм / гггг) Являются ли Cookies угрозой безопасности? Получить переменное имя объекта внутри объекта php

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

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

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 () . Теперь он отлично работает.