@@ -33,7 +33,6 @@ class StaticProperties
33
33
* @var array
34
34
*/
35
35
protected static $ _classesToSkip = [
36
- 'Mage ' ,
37
36
'Magento\Framework\App\ObjectManager ' ,
38
37
'Magento\TestFramework\Helper\Bootstrap ' ,
39
38
'Magento\TestFramework\Event\Magento ' ,
@@ -43,6 +42,11 @@ class StaticProperties
43
42
'Magento\Framework\Phrase ' ,
44
43
];
45
44
45
+ /**
46
+ * @var \ReflectionClass[]
47
+ */
48
+ static protected $ classes = [];
49
+
46
50
/**
47
51
* Constructor
48
52
*/
@@ -73,10 +77,11 @@ protected static function _isClassCleanable(\ReflectionClass $reflectionClass)
73
77
{
74
78
// do not process blacklisted classes from integration framework
75
79
foreach (self ::$ _classesToSkip as $ notCleanableClass ) {
76
- if ($ reflectionClass ->getName () == $ notCleanableClass || is_subclass_of (
77
- $ reflectionClass ->getName (),
78
- $ notCleanableClass
79
- )
80
+ if ($ reflectionClass ->getName () == $ notCleanableClass ||
81
+ is_subclass_of (
82
+ $ reflectionClass ->getName (),
83
+ $ notCleanableClass
84
+ )
80
85
) {
81
86
return false ;
82
87
}
@@ -107,6 +112,18 @@ protected static function _isClassInCleanableFolders($classFile)
107
112
return false ; // File is not in an "include" directory
108
113
}
109
114
115
+ /**
116
+ * @param string $class
117
+ * @return \ReflectionClass
118
+ */
119
+ private static function getReflectionClass ($ class )
120
+ {
121
+ if (!isset (self ::$ classes [$ class ])) {
122
+ self ::$ classes [$ class ] = new \ReflectionClass ($ class );
123
+ }
124
+
125
+ return self ::$ classes [$ class ];
126
+ }
110
127
111
128
/**
112
129
* Restore static variables (after running controller test case)
@@ -115,7 +132,7 @@ protected static function _isClassInCleanableFolders($classFile)
115
132
public static function restoreStaticVariables ()
116
133
{
117
134
foreach (array_keys (self ::$ backupStaticVariables ) as $ class ) {
118
- $ reflectionClass = new \ ReflectionClass ($ class );
135
+ $ reflectionClass = self :: getReflectionClass ($ class );
119
136
$ staticProperties = $ reflectionClass ->getProperties (\ReflectionProperty::IS_STATIC );
120
137
foreach ($ staticProperties as $ staticProperty ) {
121
138
$ staticProperty ->setAccessible (true );
@@ -130,43 +147,52 @@ public static function restoreStaticVariables()
130
147
*/
131
148
public static function backupStaticVariables ()
132
149
{
133
- $ classFiles = Files::init ()->getPhpFiles (
134
- Files::INCLUDE_APP_CODE
135
- | Files::INCLUDE_LIBS
136
- | Files::INCLUDE_TESTS
150
+ if (count (self ::$ backupStaticVariables ) > 0 ) {
151
+ return ;
152
+ }
153
+
154
+ $ classFiles = array_filter (
155
+ Files::init ()->getPhpFiles (
156
+ Files::INCLUDE_APP_CODE
157
+ | Files::INCLUDE_LIBS
158
+ | Files::INCLUDE_TESTS
159
+ ),
160
+ function ($ classFile ) {
161
+ return StaticProperties::_isClassInCleanableFolders ($ classFile )
162
+ && strpos (file_get_contents ($ classFile ), ' static ' ) > 0 ;
163
+ }
137
164
);
165
+
138
166
$ namespacePattern = '/namespace [a-zA-Z0-9 \\\\]+;/ ' ;
139
167
$ classPattern = '/\nclass [a-zA-Z0-9_]+/ ' ;
168
+
140
169
foreach ($ classFiles as $ classFile ) {
141
- if (self ::_isClassInCleanableFolders ($ classFile )) {
142
- $ file = @fopen ($ classFile , 'r ' );
143
- $ code = fread ($ file , 4096 );
144
- preg_match ($ namespacePattern , $ code , $ namespace );
145
- preg_match ($ classPattern , $ code , $ class );
146
- if (!isset ($ namespace [0 ]) || !isset ($ class [0 ])) {
147
- fclose ($ file );
148
- continue ;
149
- }
150
- // trim namespace and class name
151
- $ namespace = substr ($ namespace [0 ], 10 , strlen ($ namespace [0 ]) - 11 );
152
- $ class = substr ($ class [0 ], 7 , strlen ($ class [0 ]) - 7 );
153
- $ className = $ namespace . '\\' . $ class ;
154
-
155
- try {
156
- $ reflectionClass = new \ReflectionClass ($ className );
157
- } catch (\Exception $ e ) {
158
- fclose ($ file );
159
- continue ;
160
- }
161
- if (self ::_isClassCleanable ($ reflectionClass )) {
162
- $ staticProperties = $ reflectionClass ->getProperties (\ReflectionProperty::IS_STATIC );
163
- foreach ($ staticProperties as $ staticProperty ) {
164
- $ staticProperty ->setAccessible (true );
165
- $ value = $ staticProperty ->getValue ();
166
- self ::$ backupStaticVariables [$ className ][$ staticProperty ->getName ()] = $ value ;
167
- }
170
+ $ code = file_get_contents ($ classFile );
171
+ preg_match ($ namespacePattern , $ code , $ namespace );
172
+ preg_match ($ classPattern , $ code , $ class );
173
+
174
+ if (!isset ($ namespace [0 ]) || !isset ($ class [0 ])) {
175
+ continue ;
176
+ }
177
+
178
+ // trim namespace and class name
179
+ $ namespace = substr ($ namespace [0 ], 10 , strlen ($ namespace [0 ]) - 11 );
180
+ $ class = substr ($ class [0 ], 7 , strlen ($ class [0 ]) - 7 );
181
+ $ className = $ namespace . '\\' . $ class ;
182
+
183
+ try {
184
+ $ reflectionClass = self ::getReflectionClass ($ className );
185
+ } catch (\Exception $ e ) {
186
+ continue ;
187
+ }
188
+
189
+ if (self ::_isClassCleanable ($ reflectionClass )) {
190
+ $ staticProperties = $ reflectionClass ->getProperties (\ReflectionProperty::IS_STATIC );
191
+ foreach ($ staticProperties as $ staticProperty ) {
192
+ $ staticProperty ->setAccessible (true );
193
+ $ value = $ staticProperty ->getValue ();
194
+ self ::$ backupStaticVariables [$ className ][$ staticProperty ->getName ()] = $ value ;
168
195
}
169
- fclose ($ file );
170
196
}
171
197
}
172
198
}
0 commit comments