|
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
SomeClassto useselfinstead: