$value) { if (in_array($key, CompanySettings::$string_casts)) { $value = "string"; if (!property_exists($settings, $key)) { continue; } elseif (!$this->checkAttribute($value, $settings->{$key})) { return [$key, $value, $settings->{$key}]; } continue; } /*Separate loop if it is a _id field which is an integer cast as a string*/ elseif (substr($key, -3) == '_id' || substr($key, -14) == 'number_counter') { $value = "integer"; if (!property_exists($settings, $key)) { continue; } elseif (!$this->checkAttribute($value, $settings->{$key})) { return [$key, $value, $settings->{$key}]; } continue; } elseif ($key == 'pdf_variables') { continue; } /* Handles unset settings or blank strings */ if (!property_exists($settings, $key) || is_null($settings->{$key}) || !isset($settings->{$key}) || $settings->{$key} == '') { continue; } /*Catch all filter */ if (!$this->checkAttribute($value, $settings->{$key})) { return [$key, $value, $settings->{$key}]; } } return true; } /** * Type checks a object property. * @param string $key The type * @param string $value The object property * @return bool TRUE if the property is the expected type */ private function checkAttribute($key, $value) :bool { switch ($key) { case 'int': case 'integer': return ctype_digit(strval(abs($value))); case 'real': case 'float': case 'double': return is_float($value) || is_numeric(strval($value)); case 'string': return method_exists($value, '__toString') || is_null($value) || is_string($value); case 'bool': case 'boolean': return is_bool($value) || (int) filter_var($value, FILTER_VALIDATE_BOOLEAN); case 'object': return is_object($value); case 'array': return is_array($value); case 'json': json_decode($string); return (json_last_error() == JSON_ERROR_NONE); default: return false; } } }