-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclass-name-resolution.php
More file actions
97 lines (77 loc) · 2.4 KB
/
class-name-resolution.php
File metadata and controls
97 lines (77 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
trait Meta {
public $a = 1;
public static $b = 2;
public function __construct($c) {
echo "-- constructor called with param: c($c) -- \n";
}
private function inStaticContext() {
$backtrace = debug_backtrace();
return $backtrace[1]['type'] == '::';
}
public function classVars() {
$vars = get_class_vars(__CLASS__);
$accessedVars = [];
foreach ($vars as $key => $var) {
if (isset(static::${$key})) {
$accessedVars[] = $key . "(".static::${$key}.")";
}
else if (isset($this) && isset($this->$key)) {
$accessedVars[] = $key . "(".$this->$key.")";
}
}
return implode(", ", $accessedVars);
}
public static function output($method) {
$static = static::inStaticContext() ? "static context" : "object context";
$classVars = static::classVars();
$msg = "Called $method from $static and has access to member variables: $classVars";
echo "-- " . $msg . "\n";
}
}
class A {
use Meta;
public function pubFun() {
static::output(__METHOD__);
}
public static function statPubFun() {
static::output(__METHOD__);
}
}
echo "## Calling by class resolution:\n";
call_user_func([A::class, 'pubFun']);
call_user_func([A::class, 'statPubFun']);
echo "\n";
echo "## Instantiating object:\n";
$a = new A(3);
echo "\n";
echo "## Calling with object:\n";
call_user_func([$a, 'pubFun']);
call_user_func([$a, 'statPubFun']);
echo "\n";
echo "## Calling with object referenced class (get_class):\n";
call_user_func([get_class($a), 'pubFun']);
call_user_func([get_class($a), 'statPubFun']);
// ------------
echo "\n";
echo "\n";
echo "## Instantiating object from anynymous class:\n";
$anon = new class(3) {
use Meta;
public function pubFun() {
static::output(__METHOD__);
}
public static function statPubFun() {
static::output(__METHOD__);
}
};
echo "\n";
echo "## Calling with object created from anynonymous class:\n";
call_user_func([$anon, 'pubFun']);
call_user_func([$anon, 'statPubFun']);
echo "\n";
echo "## Calling with object referenced class (get_class) from anynonymous class:\n";
call_user_func([get_class($anon), 'pubFun']);
call_user_func([get_class($anon), 'statPubFun']);
// define("CLASS_REF", get_class($anon));
// call_user_func([CLASS_REF, 'pubFun']);