Ben SABİT adlı bir PHP sınıfı tanımlanmış alabilirim?

9 Cevap php

Ben birkaç SABİT ait bazı sınıfları tanımlanmış olması ve bunların bir listesini almak istiyorum. Örneğin:

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

SABİT en Profile sınıfında tanımlanan bir listesini almak için herhangi bir yolu var mı? Bildiğim kadarıyla söyleyebilirim, yakın seçenektir (get_defined_constants()) hile yapmayacağım.

Ne gerçekten ihtiyacınız sabit adları listesi - böyle bir şey:

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

Veya:

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

Ya da:

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

9 Cevap

Bunun için Reflection kullanabilirsiniz. Bunu yapıyoruz, eğer sonucu önbelleğe bakarak isteyebilirsiniz unutmayın.

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

Çıktı:

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

This

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

PHP docs yorumların başına, sen ReflectionClass (PHP 5) kullanmak mümkün iseniz:

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

Source is here.

PHP5'ta Eğer Yansıma kullanabilirsiniz: (manual reference)

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

Kullan token_get_all(). Yani:

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

Çıktı:

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

Evet, kullanabilirsiniz reflection. Çıktının bak

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

İşte size bakıyor olacak ne bir fikir vermelidir.

Neden başlamak için bir dizi olarak bir sınıf değişkeni onları koymak değil mi? Aracılığıyla döngü kolaylaştırır.

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

Sonunda ad alanları ile:

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