Llamada a una función miembro en un no objeto [duplicado]

Resuelto Scott Gottreu asked hace 54 años • 8 respuestas

Entonces estoy refactorizando mi código para implementar más programación orientada a objetos. Configuré una clase para contener 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() así

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 no objeto

Entonces, ¿qué me estoy perdiendo?

Scott Gottreu avatar Jan 01 '70 08:01 Scott Gottreu
Aceptado

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

Como espera un tipo de objeto específico, también puede utilizar los documentos de la función de sugerencias de tipo de PHP para obtener el error cuando se viola su lógica:

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

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

Allain Lalonde avatar Sep 10 '2008 16:09 Allain Lalonde

Hay una manera fácil de producir este error:

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

Representará el error:

Error fatal: llamada a una función miembro 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 simplemente dijera,

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

Por lo general, ha creado su clase de modo que $joeno esté definida en el constructor o

David Urry avatar Oct 24 '2012 19:10 David Urry

O $objPageno es una variable de instancia O estás sobrescribiendo $objPagecon algo que no es una instancia de class PageAttributes.

dipole_moment avatar Dec 02 '2012 09:12 dipole_moment

También podría significar que cuando inicializó su objeto, es posible que haya reutilizado el nombre del objeto en otra parte de su código. Por lo tanto, cambia 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.
Gui Lui avatar Oct 28 '2013 19:10 Gui Lui
function page_properties($objPortal) {    
    $objPage->set_page_title($myrow['title']);
}

parece diferentes nombres de variables $objPortal vs $objPage

Falc avatar Nov 20 '2013 09:11 Falc