php define () vs const





5 Answers

Hasta PHP 5.3, const no podía usarse en el ámbito global. Solo puedes usar esto desde dentro de una clase. Debe usarse cuando desee establecer algún tipo de opción constante o configuración que pertenezca a esa clase. O tal vez quieres 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 debe usarse 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. Echa un vistazo a las constantes de la DOP . Cuando necesite especificar un tipo de recuperación, escriba PDO::FETCH_ASSOC , por ejemplo. Si no se usaran consts, terminarías escribiendo algo como 35 (o FETCH_ASSOC se define FETCH_ASSOC ). Esto no tiene sentido para el lector.

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

php const constants

Pregunta bastante sencilla: 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ítame agregar una advertencia no obvia al usar espacios de nombres para que no quede atrapado con un comportamiento inesperado. Lo que hay que recordar es que las definiciones están siempre 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 de esto 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 que para mí hace que toda la noción constante de confusión sea innecesaria, ya que la idea de una constante en docenas de otros idiomas es que siempre es la misma donde sea que esté en su código, y PHP realmente no lo garantiza.




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

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

Mientras que puedes con un define (). Por lo tanto, realmente no se reduce a las preferencias personales, hay una forma correcta e incorrecta de usar ambas.

Dejando de lado ... 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 pueda ser aislada a las clases.




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

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



Related