it-swarm.com.de

Kann ich CONSTs für eine PHP Klasse?

Ich habe mehrere CONSTs für einige Klassen definiert und möchte eine Liste davon erhalten. Zum Beispiel:

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

Gibt es eine Möglichkeit, eine Liste der in der Profile-Klasse definierten CONSTs abzurufen? Soweit ich das beurteilen kann, wird die nächstgelegene Option (get_defined_constants()) nicht ausreichen.

Was ich wirklich brauche, ist eine Liste der konstanten Namen - etwa so:

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

Oder:

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

Oder auch:

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

Sie können dafür Reflection verwenden. Wenn Sie dies häufig tun, sollten Sie das Ergebnis zwischenspeichern.

<?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());

Ausgabe:

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

Diese

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

Verwenden Sie token_get_all () . Nämlich:

<?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";
}
?>

Ausgabe:

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

Wenn Sie die ReflectionClass (PHP 5) verwenden können, lesen Sie die Dokumentkommentare von PHP:

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

Quelle ist hier.

12
mway

In PHP5 können Sie Reflection verwenden: (manuelle Referenz)

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

Die Verwendung von ReflectionClass und getConstants() gibt genau das, was Sie möchten:

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

Ausgabe:

Array
(
    [AAA] => 1
    [BBB] => 2
)
7
Ben James

Ja, du verwendest Reflektion . Schauen Sie sich die Ausgabe von an

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

Das sollte Ihnen eine Vorstellung davon geben, worauf Sie schauen.

4
chaos

Zug mit statischer Methode - zur Rettung

Anscheinend ist es ein schöner Ort, um Traits mit einer statischen Funktion zu verwenden, um die Klassenfunktionalität zu erweitern. Mit Traits können wir diese Funktionalität auch in anderen Klassen implementieren, ohne den gleichen Code immer wieder neu zu schreiben (stay DRY).

Verwenden Sie unsere benutzerdefinierte 'ConstantExport'-Eigenschaft in der Profilklasse. Machen Sie es für jede Klasse, für die Sie diese Funktionalität benötigen. 

/**
 * 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;

}

Anwendungsbeispiel

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

print_r($constList); // TEST

AUSGABEN:

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

Es ist praktisch, eine Methode innerhalb der Klasse zu haben, um ihre eigenen Konstanten zurückzugeben.
Sie können dies auf folgende Weise tun:

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());
3
Luis Siquot

Warum setzen Sie sie nicht zuerst in eine Klassenvariable als Array ein? Erleichtert das Durchschleifen. 

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

Eventuell mit Namespaces:

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());
2
revoke
Class Qwerty 
{
    const __COOKIE_LANG_NAME__ = "zxc";
    const __UPDATE_COOKIE__ = 30000;

    // [1]
    public function getConstants_(){

        return ['__COOKIE_LANG_NAME__' => self::__COOKIE_LANG_NAME__, 
                '__UPDATE_COOKIE__' => self::__UPDATE_COOKIE__]; 
    }    

    // [2]
    static function getConstantsStatic_(){

        return ['__COOKIE_LANG_NAME__' => self::__COOKIE_LANG_NAME__, 
                '__UPDATE_COOKIE__' => self::__UPDATE_COOKIE__]; 
    } 
}

// [1]
$objC = new Qwerty();
var_dump($objC->getConstants_());

// [2]
var_dump(Qwerty::getConstantsStatic_());