Eğer bir sınıfta tanımlanan bir sabit var varsayarsak:
class Foo {
const ERR_SOME_CONST = 6001;
function bar() {
$x = 6001;
// need to get 'ERR_SOME_CONST'
}
}
PHP ile mümkün mü?
Sen reflection API ile onları alabilirsiniz
I'm assuming you would like to get the name of the constant based on the value of your variable (value of variable == value of constant). Get all the constants defined in the class, loop over them and compare the values of those constants with the value of your variable. Note that with this approach you might get some other constant that the one you want, if there are two constants with the same value.
Örnek:
class Foo {
const ERR_SOME_CONST = 6001;
const ERR_SOME_OTHER_CONST = 5001;
function bar() {
$x = 6001;
$fooClass = new ReflectionClass ( 'Foo' );
$constants = $fooClass->getConstants();
$constName = null;
foreach ( $constants as $name => $value )
{
if ( $value == $x )
{
$constName = $name;
break;
}
}
echo $constName;
}
}
ps: Eğer çok sıradışı görünüyor gibi, bu neden ihtiyaç söylüyorum sakıncası yok ...
Uyarı: Eğer programı yapılmalı, bu şekilde ... (konum eğer emin değil ne sen yapıyor :))
Ben CATEGORY_ seçtiğiniz tarafından sabitler ve bunların sayısal değerlerini echos 1 satır yazdı
işte CATEGORY_ ERR_ listesidir
foreach(get_defined_constants() as $key => $value) if(strlen($key)>5) if(substr($key, 0,5)=="ERR_") echo"<br>Found an php ERR_ constant! : ".$key."=>".$value;
And if you want just the one youre looking for by number => I created 1row function:
//input parameters: CATEGORYNAME_ , #constantNumber
function getConstantName($category,$constantNumber){foreach(get_defined_constants() as $key => $value) if(strlen($key)>strlen($category)) if(substr($key, 0,strlen($category))==$category) if($value==$constantNumber) return $key; return "No constant found.";}
Numarası ile 64 Yani, örneğin bazı bilgiler sabiti:
echo "NameOfConstant: ".getConstantName("INFO_",64);
olacak çıkış gibi bir şey: NameOfConstant: INFO_LICENSE
İşte bunu başarmak için ne yaptığını. Jan Hancic esinlenerek.
<!-- language: lang-php -->
class ErrorCode
{
const COMMENT_NEWCOMMENT_DISABLED = -4;
const COMMENT_TIMEBETWEENPOST_ERROR = -3;
/**
* Get error message of a value. It's actually the constant's name
* @param integer $value
*
* @return string
*/
public static function getErrorMessage($value)
{
$class = new ReflectionClass('ErrorCode');
$constants = $class->getConstants();
$constants = array_flip($constants);
return $constants[$value];
}
}
Bütün sabit, bu işlevini kullanarak bir dizi atanabilir.
enter code here
$ const = get_defined_constants ();
sonra aşağıdaki işlevi kullanarak size dizi yapısını yazdırabilirsiniz
echo "<pre>";
print_r($const);
ve burada daha fazla açıklama görebilirsiniz www.sugunan.com
Bu eski bir soru hepsi olduğunu biliyorum, ama ben hala bazı yararlı giriş var olduğunu hissediyorum. Ben bütün enums uzatmak soyut bir sınıf kullanarak bu hayata. Soyut sınıf genel toString () yöntemi içerir;
abstract class BaseEnum{
private final function __construct(){ }
public static function toString($val){
$tmp = new ReflectionClass(get_called_class());
$a = $tmp->getConstants();
$b = array_flip($a);
return ucfirst(strtolower($b[$val]));
}
}
//actual enum
final class UserType extends BaseEnum {
const ADMIN = 10;
const USER = 5;
const VIEWER = 0;
}
Bu şekilde, bir insan okunabilir dize taban enum uzanan her enum üzerine, çıkışta kullanmak için alabilirsiniz. Ayrıca, enum sizin uygulama, final
, genişletilmiş edilemez olan ve BaseEnum
içinde yapıcı olduğu için private
Bu örneği olamaz.
Kendi türleri ile tüm kullanıcı adlarının bir listesini gösterir Yani, örneğin, gibi bir şey yapabilirsiniz
foreach($users as $user){
echo "<li>{$user->name}, ".UserType::toString($user->usertype)."</li>";
}