1 | <?php |
||
13 | class Compiler |
||
14 | { |
||
15 | /** |
||
16 | * @var ClassDefinition[] |
||
17 | */ |
||
18 | protected $classes = array(); |
||
19 | |||
20 | /** |
||
21 | * @var FunctionDefinition[] |
||
22 | */ |
||
23 | protected $functions = array(); |
||
24 | |||
25 | /** |
||
26 | * @param ClassDefinition $class |
||
27 | */ |
||
28 | 6 | public function addClass(ClassDefinition $class) |
|
29 | { |
||
30 | 6 | $this->classes[implode('\\', [$class->getNamespace(), $class->getName()])] = $class; |
|
31 | 6 | } |
|
32 | |||
33 | /** |
||
34 | * @param FunctionDefinition $function |
||
35 | */ |
||
36 | public function addFunction(FunctionDefinition $function) |
||
40 | |||
41 | /** |
||
42 | * @param Context $context |
||
43 | */ |
||
44 | 6 | public function compile(Context $context) |
|
45 | { |
||
46 | 6 | $context->scopePointer = null; |
|
47 | |||
48 | /** |
||
49 | * @todo Implement class map... |
||
50 | */ |
||
51 | 6 | foreach ($this->classes as $class) { |
|
52 | 6 | $extends = $class->getExtendsClass(); |
|
53 | 6 | if ($extends) { |
|
|
|||
54 | if (isset($this->classes[$extends])) { |
||
55 | $class->setExtendsClassDefinition($this->classes[$extends]); |
||
56 | } else { |
||
57 | if (class_exists($extends, true)) { |
||
58 | $class->setExtendsClassDefinition( |
||
59 | new RuntimeClassDefinition( |
||
60 | new ReflectionClass( |
||
61 | $extends |
||
62 | ) |
||
63 | ) |
||
64 | ); |
||
65 | } |
||
66 | } |
||
67 | } |
||
68 | 6 | } |
|
69 | |||
70 | 6 | foreach ($this->functions as $function) { |
|
71 | /** |
||
72 | * @todo Configuration |
||
73 | * |
||
74 | * Ignore functions compiling from vendor |
||
75 | */ |
||
76 | $checkVendor = strpos($function->getFilepath(), './vendor'); |
||
77 | if ($checkVendor !== false && $checkVendor < 3) { |
||
78 | continue; |
||
79 | } |
||
80 | |||
81 | $function->compile($context); |
||
82 | 6 | } |
|
83 | |||
84 | 6 | foreach ($this->classes as $class) { |
|
85 | /** |
||
86 | * @todo Configuration |
||
87 | * |
||
88 | * Ignore Classes compiling from vendor |
||
89 | */ |
||
90 | 6 | $checkVendor = strpos($class->getFilepath(), './vendor'); |
|
91 | 6 | if ($checkVendor !== false && $checkVendor < 3) { |
|
92 | continue; |
||
93 | } |
||
94 | |||
95 | 6 | $class->compile($context); |
|
96 | 6 | } |
|
97 | 6 | } |
|
98 | |||
99 | /** |
||
100 | * Try to find function with $namespace from pre-compiled function(s) |
||
101 | * |
||
102 | * @param string $name |
||
103 | * @param string|null $namespace |
||
104 | * @return bool|FunctionDefinition |
||
105 | */ |
||
106 | 5 | public function getFunctionNS($name, $namespace = null) |
|
107 | { |
||
108 | 5 | foreach ($this->functions as $function) { |
|
109 | if ($function->getName() == $name && $function->getNamespace() == $namespace) { |
||
110 | return $function; |
||
111 | } |
||
112 | 5 | } |
|
113 | |||
114 | 5 | return false; |
|
115 | } |
||
116 | |||
117 | /** |
||
118 | * Try to find function from pre-compiled function(s) |
||
119 | * |
||
120 | * @param string $name |
||
121 | * @return bool|FunctionDefinition |
||
122 | */ |
||
123 | public function getFunction($name) |
||
133 | } |
||
134 |
In PHP, under loose comparison (like
==
, or!=
, orswitch
conditions), values of different types might be equal.For
string
values, the empty string''
is a special case, in particular the following results might be unexpected: