Nasıl Enum gibi fonksiyonalite (Java ve diğer yüksek seviyeli dillerde sağlanan gibi) PHP kullanılabilir mi? Ben PHP şu anda Çeteleler oluşturmak için izin vermez biliyorum, ama bir olsun en yakın nedir?
Ben sınıf sabitlerini ve yansıma hile biraz kullanabilirsiniz.
<?php
/**
* @package Red.Core
* @author kris@theredhead.nl
*
* Implements the abstract base for all enum types
*
* example of a typical enum:
*
* class DayOfWeek extends Enum
* {
* const Sunday = 0;
* const Monday = 1;
* const Tuesday = 2;
* const Wednesday = 3;
* const Thursday = 4;
* const Friday = 5;
* const Saturday = 6;
* }
*
* usage examples:
*
* $monday = Enum::FromString( 'DayOfWeek::Monday' ); // (int) 1
* $monday = DayOfWeek::Monday // (int) 1
* $monday = Enum::ToString( 'DayOfWeek', DayOfWeek::Monday ); // (string) "DayOfWeek::Monday"
* $monday = Enum::Label( 'DayOfWeek', DayOfWeek::Monday ); // (string) "Monday"
*
**/
abstract class Enum
{
// make sure there are never any instances created
final private function __construct()
{
throw new Exception( 'Enum and Subclasses cannot be instantiated.' );
}
/**
* Give the integer associated with the const of the given string in the format of "class:const"
*
* @param string $string
* @return integer
*/
final public static function FromString( $string )
{
if ( strpos( $string, '::' ) < 1 )
{
throw new Exception( 'Enum::FromString( $string ) Input string is not in the expected format.' );
}
list( $class, $const ) = explode( '::', $string );
if ( class_exists( $class, false ) )
{
$reflector = new ReflectionClass( $class );
if ( $reflector->IsSubClassOf( 'Enum' ) )
{
if ( $reflector->hasConstant( $const ) )
{
return eval( sprintf( 'return %s;', $string ) );
}
}
}
throw new Excption( sprintf( '%s does not map to an Enum field', $string ) );
}
final public static function IsValidValue( $enumType, $enumValue )
{
if ( class_exists( $enumType ) )
{
$reflector = new ReflectionClass( $enumType );
if ( $reflector->IsSubClassOf( 'Enum' ) )
{
foreach( $reflector->getConstants() as $label => $value )
{
if ( $value == $enumValue )
{
return true;
}
}
}
}
return false;
}
final public static function IsValidLabel( $enumType, $enumValue )
{
if ( class_exists( $enumType ) )
{
$reflector = new ReflectionClass( $enumType );
if ( $reflector->IsSubClassOf( 'Enum' ) )
{
foreach( $reflector->getConstants() as $label => $value )
{
if ( $label == $enumValue )
{
return true;
}
}
}
}
return false;
}
/**
* For a given $enumType, give the complete string representation for the given $enumValue (class::const)
*
* @param string $enumType
* @param integer $enumValue
* @return string
*/
final public static function ToString( $enumType, $enumValue )
{
$result = 'NotAnEnum::IllegalValue';
if ( class_exists( $enumType, false ) )
{
$reflector = new ReflectionClass( $enumType );
$result = $reflector->getName() . '::IllegalValue';
foreach( $reflector->getConstants() as $key => $val )
{
if ( $val == $enumValue )
{
$result = str_replace( 'IllegalValue', $key, $result );
break;
}
}
}
return $result;
}
/**
* For a given $enumType, give the label associated with the given $enumValue (const name in class definition)
*
* @param string $enumType
* @param integer $enumValue
* @return string
*/
final public static function Label( $enumType, $enumValue )
{
$result = 'IllegalValue';
if ( class_exists( $enumType, false ) )
{
$reflector = new ReflectionClass( $enumType );
foreach( $reflector->getConstants() as $key => $val )
{
if ( $val == $enumValue )
{
$result = $key;
break;
}
}
}
return $result;
}
}
?>
Bunu da kullanabilirsiniz:
class Enum{
private $m_valueName = NULL;
private function __construct($valueName){
$this->m_valueName = $valueName;
}
public static function __callStatic($methodName, $arguments){
$className = get_called_class();
return new $className($methodName);
}
function __toString(){
return $this->m_valueName;
}
}
class NotificationType extends Enum{
const Notification = NULL;
const Warning = NULL;
const Error = NULL;
}
function Test(NotificationType $type){
echo "Test function, type: $type<br>";
}
Test(NotificationType::Warning());
Sen sabitleri kullanabilirsiniz
class myClass {
const aValue = 123;
const aString = "ABC";
};
Ama onu yönetmek için daha kolay olurdu bu yüzden muhtemelen bir ortak dizi için tercih olacaktır içlerinden yineleme güzel bir yol vermek olmaz:
class myClass{
$enum = array ("first" => 123,
"second" => "ABC");
}
Ucuz bir hile olası değerlere sahip bir dizi oluşturmaktır. Ancak, yukarıdaki cevapları aksine, ben anahtar / değer çiftleri eşit, yani olan bir dizi için tercih ediyorum:
<?php
$enum = Array(
'apple' => 'apple',
'pear' => 'pear',
'orange' => 'orange'
);
?>
Bu şekilde, ($enum[$value] != $value)
, bilirsin eğer verilen değer kümesi değildir.
Eğer anahtar / değer çiftleri farklı olmasını istiyorsanız tabii, normal bir dizi gitmek için yol olacaktır.