Llamada a una función miembro en un objeto no

Así que estoy refacturando mi código para implementar más OOP. Configuré una clase para mantener los atributos de página.

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; } } 

Más tarde llamo a la función set_page_title () como tal

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

Cuando lo hago, recibo el mensaje de error:

Llamada a una función miembro set_page_title () en un objeto no objeto

Entonces, ¿qué me estoy perdiendo?

Significa que $objPage no es una instancia de un objeto. ¿Podemos ver el código que utilizó para inicializar la variable?

Como espera un tipo de objeto específico, también puede hacer uso de la función de escritura de tipo de documento de PHP para obtener el error cuando se infringe su lógica:

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

Esta función solo aceptará PageAtrributes para el primer parámetro.

Hay una manera fácil de producir este error:

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

Presentará el error:

Error grave: llamar a un miembro funciona anything() en un no objeto en /Applications/XAMPP/xamppfiles/htdocs/casMail/dao/server.php en la línea 23

Sería mucho mejor si PHP dijera simplemente,

Error fatal: la llamada de Joe no está definida porque (a) joe es nulo o (b) joe no define anything() en línea <##>.

Por lo general, tienes que comstackr tu clase para que $joe no esté definido en el constructor o

O $objPage no es una variable de instancia O está sobrescribiendo $objPage con algo que no es una instancia de la clase PageAttributes .

También podría significar que cuando inicializó su objeto, puede haber reutilizado el nombre del objeto en otra parte de su código. Por lo tanto, cambiar su aspecto de un objeto a una variable estándar.

ES DECIR

 $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. 

En lugar de pasar el objeto como parámetro, puede declarar el objeto como global dentro de la función 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']); } 

se ve como diferentes nombres de variables $ objPortal vs $ objPage

puede usar ‘usar’ en la función como ejemplo a continuación

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

Me di cuenta de que no estaba pasando $ objPage en page_properties () . Funciona bien ahora.