Sabitinin adını almak nasıl?

7 Cevap php

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ü?

7 Cevap

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 ...

Yansıma ile:

$class = new ReflectionClass("Foo");
$constants = $class->getConstants();

$constants class Foo tanımlanan sabitlerin tüm adları ve değerleri tutan bir dizidir.

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 "&lt;pre&gt;";

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

Eğer aynı sınıfın bir yöntem üzerinde sabit bir değer almak gerekiyorsa, sadece kendi operatörünü kullanmanız gerekir. Eğer başka bir sınıf üzerinde sabitler kullanmak istiyorsanız yansıma kullanabilirsiniz

class Foo {
    const ERR_SOME_CONST = 6001;

    function bar() {
        self::ERR_SOME_CONST;
    }
}