J'aimerais pouvoir faire quelque chose comme ceci:
class ThingIDs
{
const Something = 1;
const AnotherThing = 2;
}
$thing = 'Something';
$id = ThingIDs::$thing;
Cela ne marche pas. Existe-t-il un moyen simple de faire quelque chose d'équivalent? Notez que je suis coincé avec la classe; c'est dans une bibliothèque que je ne peux pas réécrire. J'écris du code qui prend des arguments sur la ligne de commande, et j'aimerais vraiment qu'il prenne des noms symboliques au lieu de numéros d'identification.
ThingIDs::{$thing}
?Réponses:
$id = constant("ThingIDs::$thing");
http://php.net/manual/en/function.constant.php
la source
defined("ThingIDs::$thing");
$id = constant(sprintf('%s::%s', ThingIDs::class, $thing));
use
en haut du fichier, puis en utilisant la::class
méthode pour obtenir le nom de domaine complet par magie, améliore la lisibilité.Utiliser la réflexion
la source
Si vous utilisez des espaces de noms, vous devez inclure l'espace de noms avec la classe.
la source
la source
Fonction d'assistance
Vous pouvez utiliser une fonction comme celle-ci:
Cela prend deux arguments:
Si une instance d'objet est transmise, son nom de classe est déduit. Si vous utilisez PHP 7, vous pouvez utiliser
::class
pour passer le nom de classe approprié sans avoir à penser aux espaces de noms.Exemples
la source
Si vous avez une référence à la classe elle-même, vous pouvez effectuer les opérations suivantes:
la source
Mon problème était similaire à ce sujet. Lorsque vous avez l'objet, mais pas le nom de la classe, vous pouvez utiliser:
la source