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