2012-02-01 22 views
5

He buscado en todas partes, y parece que no puedo encontrar una respuesta de una forma u otra. ¿Es aceptable (buena o mala práctica) reutilizar o reciclar una variable? Funciona, y he usado este método varias veces, pero no sé si debería estar haciendo esto o no. Intento alejarme del uso de métodos estáticos y pasar a la inyección de dependencia.¿es aceptable reciclar o reutilizar variables?

En este ejemplo, $ table_name se establece en otro lugar.

class DbObject { 
    private $db = NULL; 
    protected $table_name; 

    public function __construct($dbh, $item) { 
     $this->db = $dbh; 
     $this->$table_name = $item; 
    } 

    // counts items in database // 
    public function count_all() { 
     try { 
      $sql = 'SELECT COUNT(*) FROM ' . $this->table_name; 

      $stmt = $this->db->query($sql); 
      $stmt->setFetchMode(pdo::FETCH_COLUMN, 0); 
      $result = $stmt->fetchColumn(); 
      return $result; 
     } catch (PDOException $e) { 
      echo $e->getMessage()); 
     } 
} 

Para utilizar esta lo utilizaría como esto:

$total_count = new DbObject(new Database(), 'items'); 
$total_count = $total_count->count_all(); 

¿Es esta una forma aceptable para codificar? Gracias por su ayuda.

+3

Es técnicamente correcto, pero dará lugar a mucha confusión durante la depuración – alecwhardy

+0

La pregunta es algo errónea: las variables a menudo se reutilizan y "reciclan" (para eso están, a menudo se usa una variable más que una vez). Usted está más preocupado por el nombre de la variable. Lo que en realidad responde a la pregunta: no uses el mismo nombre para diferentes cosas si no quieres tener amigos falsos. – hakre

Respuesta

10

La reutilización de variables para diferentes fines es un error de mantenimiento a punto de producirse.

Es una mala práctica. Una variable bien nombrada puede hacer maravillas para ayudar a la comprensión del código.

La reutilización de variables es especialmente frágil en los lenguajes dinámicos de tipado débil como PHP.

[En el oscuro pasado me he encontrado errores en el código de producción (esperar, creo que era la mía!), Donde la reutilización de bucle local vars como iyj conducen a errores ...]

+0

Gracias. Funciona, por eso he ido con eso en el pasado, pero parecía que se consideraría una mala práctica, y es por eso que pensé que probablemente debería preguntar. –

2

La gente tiende a volver a utilizar variables de "usar y tirar" como i y j , pero por lo general es una mala forma de reutilizar otras variables locales para un propósito diferente. Esto lleva a la confusión del lector sobre dónde se inicializa una variable y si las actualizaciones en una parte del código afectarán a otra parte del código. También puede haber efectos negativos en el paquete de optimización del compilador (lo que tal vez sugiera que una variable debería guardarse cuando no es necesario).

2

¿Qué hay de cuando necesita llamar a otro método del DbObject?

prefiero dar el nombre de la variable lo que es:

$dbo = new DbObject(new Database(), 'items'); 
$total_count = $dbo->count_all(); 

//so you call still do things next 
$result = $dbo->get_all(); 
1

Si te gusta usar nombres comunes menudo a través de un guión (por ejemplo $i para el recuento de iteraciones de un bucle) que no debería tener problemas si haces es un hábito llamar al unset() cada vez que haya terminado con el uso de una variable en un caso particular.

3

La razón principal para evitar reutilizar variables es que si reutiliza una variable sin reinicializarla adecuadamente, el valor anterior se "filtrará", causando efectos impredecibles e incluso vulnerabilidades de seguridad. Por ejemplo:

$foo = $_GET['input']; 
# use $foo 

if ($a == $b) { 
    $foo = 1; 
} else { 
    # $foo = 2; # Commented out for some reason 
} 
# Value $foo supplied in URL leaks through to here 

Generalmente, la reutilización de las variables no dañar el rendimiento si el compilador utiliza forma de asignación de un solo estática (SSA) como una forma intermedia durante la optimización de (parte de lo que SSA no está dando nombres separados a tales reutilizado variables). Así que no se preocupe por el rendimiento, preocúpese por la facilidad de mantenimiento.

+0

gracias por su respuesta, nunca pensé en eso de esa manera. –

+0

Si la variable anterior era una referencia, pueden ocurrir incluso más cosas malas –

0

A veces las variables pueden entrar en conflicto o puede mezclarlas. Así que solo volvería a utilizar $i y $row a menos que unset() la variable cuando haya terminado.

Cuestiones relacionadas