2010-04-30 13 views
10

Tengo un archivo main.php con una definición de clase. Otros archivos php usan este archivo main.php¿Cómo puedo ejecutar un bloque de código exactamente una vez en PHP?

//main.php 

<?php 

class A{ 


} 

//I want to execute the following statements exactly once  

$a = new A(); 
/* 
Some code 
*/ 


?> 

utilizo main.php en otros archivos php como

//php1.php 
<?php 
require_once("main.php"); 

$b = new A(); 

/* 
Some code 
*/ 

?> 

//php2.php 
<?php 
require_once("main.php"); 

$b = new A(); 

/* 
Some code 
*/ 

?> 

¿Hay alguna declaración en PHP como execute_once()? ¿Cómo soluciono esto?

+5

usando require once es lo que necesita. Su archivo se incluirá una vez. Asegúrese de leer el manual para require_once(), include() e include_once(); – Andreas

+0

Si el comentario de andreas no responde a su pregunta, ¿puede explicar con más detalle lo que quiere lograr? –

+0

El principal.El archivo php será incluido por varios otros archivos php. Quiero que el código en el archivo main.php (después de la definición de la clase) se ejecute exactamente una vez, sin importar cuántos archivos lo incluyan. Globalmente una vez no localmente una vez. – Bruce

Respuesta

9

Realmente no se puede ver cómo la pregunta original se relaciona con la respuesta aceptada. Si quiero para asegurarse de que cierto código no se ejecuta más de una vez por los scripts de terceros que lo incluyen, acabo de crear una bandera:

<?php 

if(!defined('FOO_EXECUTED')){ 
    foo(); 

    define('FOO_EXECUTED', TRUE); 
} 

?> 

Los patrones Singleton simplemente obliga a que todas las variables que instanciar una clase realidad apunta a la misma única instancia.

+0

realmente tendría que estar de acuerdo contigo ... menos gastos generales aquí IMO – espais

+0

¿Pero este hilo es seguro en el contexto de php + apache? – Keshav

+1

@Keshav No sé cuál es su preocupación, pero las secuencias de comandos PHP se ejecutan de forma independiente entre sí. –

3

Creo que necesita el Singleton pattern. Crea una sola instancia de la clase y le devuelve el mismo cada vez que lo solicita.

En la ingeniería de software, el patrón Singleton es un patrón de diseño utilizado para poner en práctica el concepto matemático de un producto único, al restringir el creación de instancias de una clase a una objeto. Esto es útil cuando se necesita exactamente un objeto para coordinar las acciones en todo el sistema. El concepto a veces se generaliza a los sistemas que operan más eficientemente cuando existe sólo un objeto, o que restringir la creación de instancias de un cierto número de objetos (por ejemplo, cinco) . Algunos consideran que es un anti-patrón, juzgando que es usado en exceso, introduce limitaciones innecesarias en situaciones en las que no se requiere realmente una única instancia de una clase y presenta el estado global en una aplicación .

actualización basada en OP Comentario:

favor ver esto:

The Singleton Design Pattern for PHP

+0

¿Cómo lo implemento en PHP? Obtuve la teoría, pero ¿cómo la implemento? – Bruce

+1

@Jack Google para el singleton PHP no ayuda? –

+0

@Jack: por favor vea mi respuesta actualizada. Gracias – Sarfraz

1

Acabo de escribir una clase para esto.

Dado que se llama estáticamente, la variable debe permanecer en toda la aplicación si se incluye en el nivel de arranque de la aplicación.

También puede optar por ejecutar el código un número específico de veces.

class exec{  
    public static $ids = array(); 
    public static function once($id){ 
    if(isset(static::$ids[$id])){ 
     return false; 
    } else { 
     if(isset(static::$ids[$id])){ 
     static::$ids[$id]++; 
     } else { 
     static::$ids[$id] = 1; 
     } 
     return true; 
    } 
    } 
    public static function times($id, $count=1){ 
    if(isset(static::$ids[$id])){ 
     if($count == static::$ids[$id]){ 
     return false; 
     } else { 
     static::$ids[$id]++; 
     return true; 
     } 
    } else { 
     static::$ids[$id] = 1; 
     return true; 
    } 
    } 
} 

//usage 

foreach(array('x', 'y', 'z') as $value){ 
    if(exec::once('tag')){ 
    echo $value; 
    } 
} 

//outputs x 

foreach(array('x', 'y', 'z') as $value){ 
    if(exec::times('tag2', 2)){ 
    echo $value; 
    } 
} 

//outputs xy 
Cuestiones relacionadas