2011-08-19 39 views
5

Digamos que tengo la clase siguiente:Trabajar con clases en PHP

class Test 
{ 
    function __construct() 
    { 
     // initialize some variable 

     $this->run(); 
    } 

    function run() 
    { 
     // do some stuff 

     $this->handle(); 
    } 

    function handle() 
    { 
    } 
} 

Normalmente me gustaría crear una instancia como:

$test = new Test(); 

Sin embargo, yo realmente no necesita el $test en cualquier lugar desde las funciones en la clase hacen todo el trabajo una vez y después de eso ya no necesitaré la instancia de la clase.

¿Qué debo hacer en esta situación o debo hacer: $test = new Test();

espero que tiene sentido lo que estoy tratando de decir si no por favor dime.

Respuesta

10

probablemente deberían ser funciones estáticas, si es que no requieren una instancia instanciado:

class Test 
{ 
    private static $var1; 
    private static $var2; 

    // Constructor is not used to call `run()`, 
    // though you may need it for other purposes if this class 
    // has non-static methods and properties. 

    // If all properties are used and discarded, they can be 
    // created with an init() function 
    private static function init() { 
     self::$var1 = 'val1'; 
     self::$var2 = 'val2'; 
    } 

    // And destroyed with a destroy() function 


    // Make sure run() is a public method 
    public static function run() 
    { 
     // Initialize 
     self::init(); 

     // access properties 
     echo self::$var1; 

     // handle() is called statically 
     self::handle(); 

     // If all done, eliminate the variables 
     self::$var1 = NULL; 
     self::$var2 = NULL; 
    } 

    // handle() may be a private method. 
    private static function handle() 
    { 
    } 
} 

// called without a constructor: 
Test::run(); 
+0

Pensé que también. Sin embargo, ¿dónde/cómo debería iniciar la variable que ahora tiene lugar en el constructor? (PS las variables deben ser accesibles por las otras funciones en la clase) – PeeHaa

+1

@PeeHaa ver adiciones arriba. Las propiedades estáticas se inicializan en un método 'init()' y se establecen en NULL después de llamar a 'handle()'. También podría eliminarlos dentro de 'handle()' –

+0

¡genial! Gracias. ¿Por qué eliminas las variables después de terminar? – PeeHaa

3

Si no lo necesita, acaba de hacer:

new Test(); 
1

Sólo puede llamar es así (new Test()).functionHere(). Alternativamente, usted podría simplemente hacer la función estática y hacer Test::functionHere()

+0

'(new Test()). FunctionHere()' nunca antes visto este estilo. Cómo se llama para poder buscarlo en los documentos. – PeeHaa

+0

No sé si tiene un nombre oficial pero básicamente estás creando el objeto sin hacer referencia a él. Como 'new Test()' devuelve un nuevo objeto Test que está listo para su uso de manera imidata. Entonces envolviéndolo en '()' puedes usar imidadamente los métodos del objeto – secretformula

1

Ninguno de esos es requerido. Incluso si mantiene la variable $ test que no cambiará nada porque no tomará ni siquiera un 0,001% de la memoria RAM. Simplemente continúa el flujo del programa. La mejor respuesta de lo anterior es iniciar la clase sin guardar una instancia en una variable. Apuesta incluso si lo haces no cambiará nada. Si yo fuera tú, iba a dejar esa variable, porque luego, si agrego otra función que necesita ser llamada manualmente, esa sería la forma más fácil de llamarla.

+0

/@ Itehnological algo más maldito es que tu nombre es demasiado largo: en realidad no es la performance/RAM lo que me preocupa. Solo quería saber cuál sería la mejor práctica en este caso. Gracias por tu respuesta :) – PeeHaa

1

Asignar un valor no es necesario, que funcionará como

new Test; 

Alternativly, usted puede escribir su clase en formato estático:

class Test 
{ 
    public static function run() 
    { 
    // do some stuff 
    self::handle(); 
    } 

    public static function handle() 
    { 
    } 
} 

y llame a su clase como:

Test::run();