namespace php constants class-constants

namespace - ¿Puedo obtener CONST definido en una clase de PHP?



namespace php (11)

Rasgo con método estático: al rescate

Parece que es un buen lugar para usar los rasgos con una función estática para extender la funcionalidad de la clase. Los rasgos también nos permitirán implementar esta funcionalidad en cualquier otra clase sin reescribir el mismo código una y otra vez (permanecer en modo SECO).

Utilice nuestro Rasgo ''ConstantExport'' personalizado con la clase de Perfil. Hazlo para cada clase que necesites esta funcionalidad.

/** * ConstantExport Trait implements getConstants() method which allows * to return class constant as an assosiative array */ Trait ConstantExport { /** * @return [const_name => ''value'', ...] */ static function getConstants(){ $refl = new /ReflectionClass(__CLASS__); return $refl->getConstants(); } } Class Profile { const LABEL_FIRST_NAME = "First Name"; const LABEL_LAST_NAME = "Last Name"; const LABEL_COMPANY_NAME = "Company"; use ConstantExport; }

USE EJEMPLO

// So simple and so clean $constList = Profile::getConstants(); print_r($constList); // TEST

SALIDAS:

Array ( [LABEL_FIRST_NAME] => First Name [LABEL_LAST_NAME] => Last Name [LABEL_COMPANY_NAME] => Company )

Tengo varias CONST definidas en algunas clases, y quiero obtener una lista de ellas. Por ejemplo:

class Profile { const LABEL_FIRST_NAME = "First Name"; const LABEL_LAST_NAME = "Last Name"; const LABEL_COMPANY_NAME = "Company"; }

¿Hay alguna manera de obtener una lista de los CONST definidos en la clase de Profile ? Por lo que puedo decir, la opción más cercana ( get_defined_constants() ) no hará el truco.

Lo que realmente necesito es una lista de los nombres constantes, algo como esto:

array(''LABEL_FIRST_NAME'', ''LABEL_LAST_NAME'', ''LABEL_COMPANY_NAME'')

O:

array(''Profile::LABEL_FIRST_NAME'', ''Profile::LABEL_LAST_NAME'', ''Profile::LABEL_COMPANY_NAME'')

O incluso:

array(''Profile::LABEL_FIRST_NAME''=>''First Name'', ''Profile::LABEL_LAST_NAME''=>''Last Name'', ''Profile::LABEL_COMPANY_NAME''=>''Company'')


¿Por qué no ponerlos en una variable de clase como una matriz para empezar? Hace que sea más fácil hacer loop through.

private $_data = array("production"=>0 ...);


El uso de ReflectionClass y getConstants() proporciona exactamente lo que desea:

<?php class Cl { const AAA = 1; const BBB = 2; } $r = new ReflectionClass(''Cl''); print_r($r->getConstants());

Salida:

Array ( [AAA] => 1 [BBB] => 2 )


En PHP5 puedes usar Reflection: (referencia manual)

$class = new ReflectionClass(''Profile''); $consts = $class->getConstants();


Es útil tener un método dentro de la clase para devolver sus propias constantes.
Puedes hacerlo de esta manera:

class Profile { const LABEL_FIRST_NAME = "First Name"; const LABEL_LAST_NAME = "Last Name"; const LABEL_COMPANY_NAME = "Company"; public static function getAllConsts() { return (new ReflectionClass(get_class()))->getConstants(); } } // test print_r(Profile::getAllConsts());


Eventualmente con espacios de nombres:

namespaces enums; class enumCountries { const CountryAustria = 1 ; const CountrySweden = 24; const CountryUnitedKingdom = 25; }

namespace Helpers; class Helpers { static function getCountries() { $c = new /ReflectionClass(''/enums/enumCountries''); return $c->getConstants(); } }

print_r(/Helpers/Helpers::getCountries());


Puedes usar Reflection para esto. Tenga en cuenta que si está haciendo esto mucho, es posible que desee buscar en el almacenamiento en caché del resultado.

<?php class Profile { const LABEL_FIRST_NAME = "First Name"; const LABEL_LAST_NAME = "Last Name"; const LABEL_COMPANY_NAME = "Company"; } $refl = new ReflectionClass(''Profile''); print_r($refl->getConstants());

Salida:

Array ( [''LABEL_FIRST_NAME''] => First Name [''LABEL_LAST_NAME''] => Last Name [''LABEL_COMPANY_NAME''] => Company )


Sí, usas el reflection . Mire la salida de

<? Reflection::export(new ReflectionClass(''YourClass'')); ?>

Eso debería darte la idea de lo que estarás viendo.


Según los comentarios de los documentos de PHP, si puede usar ReflectionClass (PHP 5):

function GetClassConstants($sClassName) { $oClass = new ReflectionClass($sClassName); return $oClass->getConstants(); }

La fuente está aquí.


Use token_get_all() . A saber:

<?php header(''Content-Type: text/plain''); $file = file_get_contents(''Profile.php''); $tokens = token_get_all($file); $const = false; $name = ''''; $constants = array(); foreach ($tokens as $token) { if (is_array($token)) { if ($token[0] != T_WHITESPACE) { if ($token[0] == T_CONST && $token[1] == ''const'') { $const = true; $name = ''''; } else if ($token[0] == T_STRING && $const) { $const = false; $name = $token[1]; } else if ($token[0] == T_CONSTANT_ENCAPSED_STRING && $name) { $constants[$name] = $token[1]; $name = ''''; } } } else if ($token != ''='') { $const = false; $name = ''''; } } foreach ($constants as $constant => $value) { echo "$constant = $value/n"; } ?>

Salida:

LABEL_FIRST_NAME = "First Name" LABEL_LAST_NAME = "Last Name" LABEL_COMPANY_NAME = "Company"


undocumented

$reflector = new ReflectionClass(''Status''); var_dump($reflector->getConstants());