|
1
|
|
|
<?php |
|
2
|
|
|
/** |
|
3
|
|
|
* Created by Gorlum 19.08.2016 20:35 |
|
4
|
|
|
*/ |
|
5
|
|
|
|
|
6
|
|
|
namespace Common; |
|
7
|
|
|
|
|
8
|
|
|
/** |
|
9
|
|
|
* Accessors storage |
|
10
|
|
|
* |
|
11
|
|
|
* TODO - make magic method access to accessors ???????? |
|
12
|
|
|
* |
|
13
|
|
|
* @package Common |
|
14
|
|
|
*/ |
|
15
|
|
|
class Accessors { |
|
16
|
|
|
|
|
17
|
|
|
/** |
|
18
|
|
|
* Array of accessors - getters/setters/etc |
|
19
|
|
|
* |
|
20
|
|
|
* @var callable[][] |
|
21
|
|
|
*/ |
|
22
|
|
|
protected $accessors = array(); |
|
23
|
|
|
|
|
24
|
|
|
/** |
|
25
|
|
|
* Assign accessor to a named variable |
|
26
|
|
|
* |
|
27
|
|
|
* Different accessors have different signatures - you should look carefully before assigning accessor |
|
28
|
|
|
* |
|
29
|
|
|
* @param string $varName |
|
30
|
|
|
* @param string $accessor - type of accessor getter/setter/importer/exporter/etc |
|
31
|
|
|
* @param callable $callable |
|
32
|
|
|
* |
|
33
|
|
|
* @throws \Exception |
|
34
|
|
|
*/ |
|
35
|
|
|
public function setAccessor($varName, $accessor, $callable) { |
|
36
|
|
|
if (empty($callable)) { |
|
37
|
|
|
return; |
|
38
|
|
|
} elseif (!is_callable($callable)) { |
|
39
|
|
|
throw new \Exception('Error assigning callable in ' . get_called_class() . '::setAccessor()! Callable typed [' . $accessor . '] is not a callable or not accessible in the scope'); |
|
40
|
|
|
} |
|
41
|
|
|
|
|
42
|
|
|
// Converting method array-callable to closure |
|
43
|
|
|
// Require PHP 5.4 !!!!!!!!!! |
|
|
|
|
|
|
44
|
|
|
// if (is_array($callable) && count($callable) == 2 && is_object($callable[0])) { |
|
45
|
|
|
// $method = new \ReflectionMethod($callable[0], $callable[1]); |
|
46
|
|
|
// $callable = $method->getClosure($callable[0]); |
|
47
|
|
|
// } |
|
48
|
|
|
|
|
49
|
|
|
$this->accessors[$varName][$accessor] = $callable; |
|
50
|
|
|
} |
|
51
|
|
|
|
|
52
|
|
|
/** |
|
53
|
|
|
* Gets accessor for later use |
|
54
|
|
|
* |
|
55
|
|
|
* @param string $varName |
|
56
|
|
|
* @param string $accessor |
|
57
|
|
|
* |
|
58
|
|
|
* @return callable|null |
|
59
|
|
|
*/ |
|
60
|
|
|
public function getAccessor($varName, $accessor) { |
|
61
|
|
|
return isset($this->accessors[$varName][$accessor]) ? $this->accessors[$varName][$accessor] : null; |
|
62
|
|
|
} |
|
63
|
|
|
|
|
64
|
|
|
/** |
|
65
|
|
|
* @param string $varName |
|
66
|
|
|
* @param string $accessor |
|
67
|
|
|
* |
|
68
|
|
|
* @return bool |
|
69
|
|
|
*/ |
|
70
|
|
|
public function haveAccessor($varName, $accessor) { |
|
71
|
|
|
return isset($this->accessors[$varName][$accessor]); |
|
72
|
|
|
} |
|
73
|
|
|
|
|
74
|
|
|
/** |
|
75
|
|
|
* @param string $varName |
|
76
|
|
|
* @param string $accessor |
|
77
|
|
|
* @param array $params |
|
78
|
|
|
* |
|
79
|
|
|
* @return mixed |
|
80
|
|
|
* @throws \Exception |
|
81
|
|
|
*/ |
|
82
|
|
|
public function invokeAccessor($varName, $accessor, $params) { |
|
83
|
|
|
if (!$this->haveAccessor($varName, $accessor)) { |
|
84
|
|
|
throw new \Exception("No [{$accessor}] accessor found for variable [{$varName}] on " . get_called_class() . "::" . __METHOD__); |
|
85
|
|
|
} |
|
86
|
|
|
|
|
87
|
|
|
return call_user_func_array($this->getAccessor($varName, $accessor), $params); |
|
88
|
|
|
} |
|
89
|
|
|
|
|
90
|
|
|
} |
|
91
|
|
|
|
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.