2009-05-20 30 views
6

Así que no estoy en OOP en PHP.Llamar a un objeto dentro de una función

Aquí está mi problema Tengo un objeto al que puedo llamar una función y proporciona una copia atrás de una biblioteca. Así que aquí está el código.

$obj = new OBJ(); 

function go($url){ 
    $array = $obj->grabArray($url); 
    echo $array['hits']; 
} 

go('http://www.mysite.com/hello'); 

Esto me da el error

Fatal error: Llamada a una función miembro grabArray() en un no-objeto

Respuesta

35

Esto no es un problema programación orientada a objetos, es un problema de ámbito. $ obj no está visible dentro de la función go(). O hay que hacer pasar como un parámetro, o ponerla en el alcance de la función con la palabra clave mundial (no se recomienda)

forma recomendada

$obj = new OBJ(); 

go('http://www.mysite.com/hello', $obj); 

function go($url, $object) 
{ 
    $array = $object->grabArray($url); 
    echo $array['hits']; 
} 

forma no recomendada

$obj = new OBJ(); 

go('http://www.mysite.com/hello'); 

function go($url) 
{ 
    global $obj; 
    $array = $object->grabArray($url); 
    echo $array['hits']; 
} 

Hay otra solución que es similar al concepto de composición de OOP: usted haría que la función go() fuera responsable de crear una instancia de OBJ.

go('http://www.mysite.com/hello'); 

function go($url) 
{ 
    $obj = new OBJ(); 
    $array = $obj->grabArray($url); 
    echo $array['hits']; 
} 

Ésta es probablemente no es ideal, sin embargo, ya que crearía una marca nueva instancia OBJ cada vez que se ejecutó Go(). Se podría solucionar este problema "caching" la instancia de OBJ dentro go() con una variable estática

function go($url) 
{ 
    static $obj; 
    if (is_null($obj)) 
    { 
     $obj = new OBJ(); 
    } 
    $array = $obj->grabArray($url); 
    echo $array['hits']; 
} 

Pero este enfoque composición similar es realmente sólo es útil si usted no usa la instancia de OBJ en otro sitio aparte dentro de la función go() - si lo usa en otro lugar, entonces el enfoque de parámetros es la mejor opción.

¡Todo se trata de elegir la solución adecuada para la tarea en cuestión!

+0

Funciona muy bien. ¡Gracias! – Tim

+0

Amo el tercer método gracias – doflamingo

Cuestiones relacionadas