[Php] define () contra const


Answers

Hasta PHP 5.3, const no se podía usar en el ámbito global. Solo puedes usar esto desde dentro de una clase. Esto debe usarse cuando desee establecer algún tipo de opción constante o configuración que pertenezca a esa clase. O tal vez quieras crear algún tipo de enumeración.

define se puede usar para el mismo propósito, pero solo se puede usar en el ámbito global. Solo se debe usar para configuraciones globales que afectan a toda la aplicación.

Un ejemplo de buen uso de const es deshacerse de los números mágicos. Eche un vistazo a las constantes de PDO . Cuando necesite especificar un tipo de búsqueda, debería escribir PDO::FETCH_ASSOC , por ejemplo. Si no se usan consts, terminarás escribiendo algo así como 35 (o lo que sea que FETCH_ASSOC se defina como). Esto no tiene sentido para el lector.

Un ejemplo de uso de buena define es tal vez especificar la ruta raíz de su aplicación o el número de versión de una biblioteca.

Question

Pregunta bastante simple: en PHP, ¿cuándo usas

define('FOO', 1);

y cuando usas

const FOO = 1;

¿Cuáles son las principales diferencias entre esos dos?




La respuesta de NikiC es la mejor, pero permíteme agregar una advertencia no obvia al usar espacios de nombres para que no te pillen con un comportamiento inesperado. Lo que hay que recordar es que define siempre están en el espacio de nombres global a menos que agregue explícitamente el espacio de nombres como parte del identificador de definición. Lo que no es obvio al respecto es que el identificador de espacio de nombres supera al identificador global. Asi que :

<?php
namespace foo
{
  // Note: when referenced in this file or namespace, the const masks the defined version
  // this may not be what you want/expect
  const BAR = 'cheers';
  define('BAR', 'wonka');

  printf("What kind of bar is a %s bar?\n", BAR);

  // To get to the define in the global namespace you need to explicitely reference it
  printf("What kind of bar is a %s bar?\n", \BAR);
}

namespace foo2
{
  // But now in another namespace (like in the default) the same syntax calls up the 
  // the defined version!
  printf("Willy %s\n", BAR);
  printf("three %s\n", \foo\BAR);  
}
?>

produce:

What kind of bar is a cheers bar? 
What kind of bar is a wonka bar?
willy wonka 
three cheers

Lo cual para mí hace que toda la noción de concisión sea innecesariamente confusa, ya que la idea de una constante en docenas de otros lenguajes es que siempre es igual dondequiera que se encuentre en su código, y PHP realmente no lo garantiza.







Nadie dice nada sobre php-doc, pero para mí ese es también un argumento muy significativo para la preferencia de const :

/**
 * My foo-bar const
 * @var string
 */
const FOO = 'BAR';



Sí, const se define en tiempo de compilación y como estados nikic no se puede asignar una expresión, como define () 's puede. Pero también const no se puede declarar condicionalmente (por la misma razón). es decir. No puedes hacer esto:

if (/* some condition */) {
  const WHIZZ = true;  // CANNOT DO THIS!
}

Mientras que podría con un define (). Entonces, realmente no se reduce a las preferencias personales, hay una forma correcta y una incorrecta de usar ambas.

Como un aparte ... Me gustaría ver algún tipo de const de clase a la que se le pueda asignar una expresión, una especie de define () que se pueda aislar a las clases?