getConstants()); } catch (ReflectionException $e) { //TODO: log it? } return array_diff($constants, $exclusions); } /** * Verifies that provided object is an instance of the $baseClass. * * If not, the new instance of the $instanceClass is created (with fallback to the $baseClass, if not provided) * Additional $params can be passed to the constructor as well. * * Example: $t = ClassUtils::verifyInstance($notSureIfT, CommonTransformation::class, Transformation::class) * * If $notSureIfT is a string, then $t will be a new Transformation initialized with the value of $notSureIfT. * In case $notSureIfT is already an instance of CommonTransformation, it is returned as is. * * @param mixed $object The value to verify * @param string $baseClass Base class name * @param string $instanceClass Instance class to create in case $object is not derivative of the $baseClass. * $baseClass is used in case it is not provided. * @param array $params Additional parameters for the constructor * * @return mixed */ public static function forceInstance($object, $baseClass, $instanceClass = null, ...$params) { if (! $object instanceof $baseClass) { $instanceClass = $instanceClass ?: $baseClass; $object = new $instanceClass($object, ...$params); } return $object; } /** * Similar to ClassUtils::forceInstance, but does not propagate null values. * * @param object|mixed $object The value to verify * @param string $baseClass Base class name * @param string $instanceClass Instance class to create in case $object is not derivative of the $baseClass. * $baseClass is used in case it is not provided. * @param array $params Additional parameters for the constructor * * @return mixed * * @see ClassUtils::forceInstance */ public static function verifyInstance($object, $baseClass, $instanceClass = null, ...$params) { if ($object === null) { // no propagation of null objects return null; } return self::forceInstance($object, $baseClass, $instanceClass, ...$params); } /** * Variable arguments version of the ClassUtils::forceInstance. * * @param array $varArgs Arguments to verify * @param string $baseClass Base class name * @param string $instanceClass Instance class to create in case $object is not derivative of the $baseClass. * $baseClass is used in case it is not provided. * * @return mixed * * @see ClassUtils::verifyInstance */ public static function forceVarArgsInstance(array $varArgs, $baseClass, $instanceClass = null) { // When passing array instead of varargs, unwrap it and proceed if (count($varArgs) === 1 && is_array($varArgs[0])) { $varArgs = $varArgs[0]; } if (count($varArgs) === 1) { return self::verifyInstance($varArgs[0], $baseClass, $instanceClass); } // At this point we create a new instance of a desired class and pass all args to it, // hopefully it'll know what to do with them :) $instanceClass = $instanceClass ?: $baseClass; return new $instanceClass(...$varArgs); } /** * Variable arguments version of the ClassUtils::verifyInstance. * * @param array $varArgs Arguments to verify * @param string $baseClass Base class name * @param string $instanceClass Instance class to create in case $object is not derivative of the $baseClass. * $baseClass is used in case it is not provided. * * @return mixed * * @see ClassUtils::verifyInstance */ public static function verifyVarArgsInstance(array $varArgs, $baseClass, $instanceClass = null) { // No args, nothing to verify if (empty($varArgs)) { return null; } return self::forceVarArgsInstance($varArgs, $baseClass, $instanceClass); } }