1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Robo\Collection; |
4
|
|
|
|
5
|
|
|
/** |
6
|
|
|
* The temporary collection keeps track of the global collection of |
7
|
|
|
* temporary cleanup tasks in instances where temporary-generating |
8
|
|
|
* tasks are executed directly via their run() method, rather than |
9
|
|
|
* as part of a collection. |
10
|
|
|
* |
11
|
|
|
* In general, temporary-generating tasks should always be run in |
12
|
|
|
* a collection, as the cleanup functions registered with the |
13
|
|
|
* Temporary collection will not run until requested. |
14
|
|
|
* |
15
|
|
|
* Since the results could be undefined if cleanup functions were called |
16
|
|
|
* at arbitrary times during a program's execution, cleanup should only |
17
|
|
|
* be done immeidately prior to program termination, when there is no |
18
|
|
|
* danger of cleaning up after some unrelated task. |
19
|
|
|
* |
20
|
|
|
* An application need never use Temporary directly, save to |
21
|
|
|
* call Temporary::wrap() inside loadTasks or loadShortcuts, and |
22
|
|
|
* to call Temporary::complete() immediately prior to terminating. |
23
|
|
|
* This is recommended, but not required; this function will be |
24
|
|
|
* registered as a shutdown function, and called on termination. |
25
|
|
|
*/ |
26
|
|
|
class Temporary |
27
|
|
|
{ |
28
|
|
|
|
29
|
|
|
/** |
30
|
|
|
* @var \Robo\Collection\Collection |
31
|
|
|
*/ |
32
|
|
|
private static $collection; |
33
|
|
|
|
34
|
|
|
/** |
35
|
|
|
* Provides direct access to the collection of temporaries, if necessary. |
36
|
|
|
* |
37
|
|
|
* @return \Robo\Collection\Collection |
38
|
|
|
*/ |
39
|
|
|
public static function getCollection() |
40
|
|
|
{ |
41
|
|
|
if (!static::$collection) { |
|
|
|
|
42
|
|
|
static::$collection = \Robo\Robo::getContainer()->get('collection'); |
|
|
|
|
43
|
|
|
register_shutdown_function(function () { |
44
|
|
|
static::complete(); |
45
|
|
|
}); |
46
|
|
|
} |
47
|
|
|
|
48
|
|
|
return static::$collection; |
|
|
|
|
49
|
|
|
} |
50
|
|
|
|
51
|
|
|
/** |
52
|
|
|
* Call the complete method of all of the registered objects. |
53
|
|
|
*/ |
54
|
|
|
public static function complete() |
55
|
|
|
{ |
56
|
|
|
// Run the collection of tasks. This will also run the |
57
|
|
|
// completion tasks. |
58
|
|
|
$collection = static::getCollection(); |
59
|
|
|
$collection->run(); |
60
|
|
|
// Make sure that our completion functions do not run twice. |
61
|
|
|
$collection->reset(); |
62
|
|
|
} |
63
|
|
|
} |
64
|
|
|
|
Let’s assume you have a class which uses late-static binding:
The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the
getSomeVariable()
on that sub-class, you will receive a runtime error:In the case above, it makes sense to update
SomeClass
to useself
instead: