Php class sabit isimlerini alın?

3 Cevap php

Ben bir örneğinin durumunu gösteren bazı sınıf sabitleri ile bir php sınıfı var.

Ben bunun üzerine bazı yöntemler çalıştırdıktan sonra ben, sınıfını kullanarak ediyorum, ben hal olmasını beklediğiniz olduğundan emin olmak için bazı kontroller yapmak.

Örneğin, bazı yöntemleri çağrıldıktan sonra, ben durum olmasını beklemek MEANINGFUL_STATUS_NAME.

$objInstance->method1();
$objInstance->method2();
if ( $objInstance->status !==  class::MEANINGFUL_STATUS_NAME ) { 
    throw new Exception("Status is wrong, should not be " . class::MEANINGFUL_STATUS_NAME . ".");
}

Ancak, bu bana özel bir mesaj verir

"Status is wrong, should not be 2"

ne gerçekten görmek istiyorum olduğunda

"Status is wrong, should not be MEANINGFUL_STATUS_NAME"

Yani sabit ismi anlamlılık kaybettim. Ben bir 'çeviri tablo' dizi yapmayı düşünüyordum, bu yüzden sabit değerlerini almak ve geri kendi adına içine çevirebilir, ancak bu hantal görünüyor. Bunu nasıl geri çevirmek gerekir, bu yüzden bana ne yanlış gitti daha iyi bir fikir verir, bir hata mesajı alıyorum?

3 Cevap

Ben sabitleri için değerleri olarak dizeleri kullanabilirsiniz şimdi bana oluşur. Ben numaralarını görmeye alışkınım. Ben bunu yapmamalıyım bir nedeni var mı, ya da neden bu işe yaramaz?

Bu zor çözümün tür:

$r = new ReflectionClass("YourClassName");
$constantNames = array_flip($r->getConstants());

$objInstance->method1();   
$objInstance->method2();   
if ( $objInstance->status !== YourClassName::MEANINGFUL_STATUS_NAME ) {    
    throw new Exception("Status is wrong, should not be " . $constantNames[YourClassName::MEANINGFUL_STATUS_NAME] . ".");   
} 

Başka bir yol durum istenen bir modda ise nesne kontrol izin olabilir.

Değilse, nesnenin yöntem İstisna atabilir.

Untested example:

class Klasse
{
    const WANTED_VALUE    =  1;
    const UNWANTED_VALUE  =  2;

    private static $constant_names  =  array();
    p... function __construct ()
    {
        if ( empty( self::$constant_names ) )
        {
            $class            =  new ReflectionClass( __CLASS__ );
            $constants        =  $class->getConstants();
            $constants        =  array_flip( $constants );// requires the constant's values to be unique
            self::$constants  =  $constants;
        }
    }
    public function checkNeededStatus ()
    {
        $needed_status  =  self::WANTED_VALUE;// could also be a parameter(an argument) with a default value
        if ( $this->status !== $needed_status )
        {
            $constant_name  =  self::$constants[ $this->status ];
            $message        =  'Status is wrong, '
                . 'should not be: `' . $constant_name . '`.'
            ;
            //$message .=  '(it should be `' . self::$constants[ $needed_status ] . '`)';
            throw new Exception( $message );
        }
    }
}

$objInstance  =  new Klasse();
$objInstance->method1();
$objInstance->method2();
$objInstance->checkNeededStatus();

credit :

It might be good to consider not using Reflection. Because the thrown message stays inside the class, this has become more likely to do without loosing much maintainability.