Initial commit.
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
/**
|
||||
* Class Base_Constant
|
||||
*
|
||||
* @package WooCommerce\Payments
|
||||
*/
|
||||
|
||||
namespace WCPay\Constants;
|
||||
|
||||
use ReflectionClass;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Base constant class to hold common logic for all constants.
|
||||
*/
|
||||
abstract class Base_Constant implements \JsonSerializable {
|
||||
|
||||
/**
|
||||
* Enum value
|
||||
*
|
||||
* @var mixed
|
||||
*/
|
||||
protected $value;
|
||||
|
||||
/**
|
||||
* Static objects cache.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $object_cache = [];
|
||||
|
||||
/**
|
||||
* Class constructor. Keep it private to only allow initializing from __callStatic()
|
||||
*
|
||||
* @param string $value Constant from class.
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
private function __construct( string $value ) {
|
||||
if ( $value instanceof static ) {
|
||||
$value = $value->get_value();
|
||||
} elseif ( ! defined( static::class . "::$value" ) ) {
|
||||
throw new \InvalidArgumentException( "Constant with name '$value' does not exist." );
|
||||
}
|
||||
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get enum class value.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function get_value() {
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare to enums.
|
||||
*
|
||||
* @param mixed $variable Constant object to compare.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
final public function equals( $variable = null ): bool {
|
||||
return $this === $variable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find constant in class by value.
|
||||
*
|
||||
* @param string $value Value to find.
|
||||
*
|
||||
* @return int|string
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public static function search( string $value ) {
|
||||
$class = new ReflectionClass( static::class );
|
||||
$key = array_search( $value, $class->getConstants(), true );
|
||||
if ( false === $key ) {
|
||||
throw new \InvalidArgumentException( "Constant with value '$value' does not exist." );
|
||||
}
|
||||
|
||||
return $key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to created enum from constant names like CLASS::ConstantName().
|
||||
*
|
||||
* @param string $name Name of property or function.
|
||||
* @param array $arguments Arguments of static call.
|
||||
*
|
||||
* @return static
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public static function __callStatic( $name, $arguments ) {
|
||||
if ( ! isset( static::$object_cache[ $name ] ) ) {
|
||||
// Instantiating constants by class name using the 'new static($name)' approach is integral to this method's functionality.
|
||||
// @phpstan-ignore-next-line.
|
||||
static::$object_cache[ $name ] = new static( $name );
|
||||
}
|
||||
return static::$object_cache[ $name ];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get real enum value.
|
||||
*
|
||||
* @return mixed|string
|
||||
*/
|
||||
public function __toString() {
|
||||
return constant( \get_class( $this ) . '::' . $this->get_value() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Specify the value which should be serialized to JSON.
|
||||
*
|
||||
* @return mixed|string
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function jsonSerialize() {
|
||||
return $this->__toString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user