result = array_merge( array_fill_keys(static::KEYS, null), [ "present" => false, "available" => false, "null" => false, "valid" => false, "normalized" => false, ]); } function __get(string $name) { return $this->result[$name]; } function __set(string $name, $value): void { $this->result[$name] = $value; } protected static function replace_key(string &$message, ?string $key): void { if ($key) $message = str_replace("{key}", $key, $message); else $message = str_replace("{key}: ", "", $message); } function setMissing(ScalarSchema $schema): int { $this->present = false; $this->available = false; if (!$schema->required) { $this->null = false; $this->valid = true; $this->normalized = true; return ref_analyze::NORMALIZED; } else { $message = cl::get($schema->messages, "missing"); self::replace_key($message, $schema->name); $this->message = $message; return ref_analyze::MISSING; } } function setUnavailable(ScalarSchema $schema): int { $this->present = true; $this->available = false; if (!$schema->required) { $this->null = false; $this->valid = true; $this->normalized = true; return ref_analyze::NORMALIZED; } else { $message = cl::get($schema->messages, "unavailable"); self::replace_key($message, $schema->name); $this->message = $message; return ref_analyze::UNAVAILABLE; } } function setNull(ScalarSchema $schema): int { $this->present = true; $this->available = true; $this->null = true; if ($schema->nullable) { $this->valid = true; $this->normalized = true; return ref_analyze::NORMALIZED; } else { $message = cl::get($schema->messages, "null"); self::replace_key($message, $schema->name); $this->message = $message; return ref_analyze::NULL; } } }