forked from laminas/laminas-code
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDeclareStatement.php
101 lines (83 loc) · 2.51 KB
/
DeclareStatement.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
namespace Laminas\Code;
use Laminas\Code\Exception\InvalidArgumentException;
use function array_keys;
use function gettype;
use function implode;
use function is_string;
use function key;
use function lcfirst;
use function sprintf;
use function str_replace;
use function ucwords;
class DeclareStatement
{
public const TICKS = 'ticks';
public const STRICT_TYPES = 'strict_types';
public const ENCODING = 'encoding';
private const ALLOWED = [
self::TICKS => 'integer',
self::STRICT_TYPES => 'integer',
self::ENCODING => 'string',
];
/** @param int|string $value */
private function __construct(protected string $directive, protected $value)
{
}
public function getDirective(): string
{
return $this->directive;
}
/**
* @return int|string
*/
public function getValue()
{
return $this->value;
}
public static function ticks(int $value): self
{
return new self(self::TICKS, $value);
}
public static function strictTypes(int $value): self
{
return new self(self::STRICT_TYPES, $value);
}
public static function encoding(string $value): self
{
return new self(self::ENCODING, $value);
}
/**
* @deprecated this API is deprecated, and will be removed in the next major release. Please
* use the other constructors of this class instead.
*/
public static function fromArray(array $config): self
{
$directive = key($config);
$value = $config[$directive];
if (! isset(self::ALLOWED[$directive])) {
throw new InvalidArgumentException(
sprintf(
'Declare directive must be one of: %s.',
implode(', ', array_keys(self::ALLOWED))
)
);
}
if (gettype($value) !== self::ALLOWED[$directive]) {
throw new InvalidArgumentException(
sprintf(
'Declare value invalid. Expected %s, got %s.',
self::ALLOWED[$directive],
gettype($value)
)
);
}
$method = str_replace('_', '', lcfirst(ucwords($directive, '_')));
return self::{$method}($value);
}
public function getStatement(): string
{
$value = is_string($this->value) ? '\'' . $this->value . '\'' : $this->value;
return sprintf('declare(%s=%s);', $this->directive, $value);
}
}