1
Vývoj / Re:PHP: Statické volání soukromé instanční metody rodiče
« kdy: 09. 03. 2018, 14:12:43 »
Tak jsem příklad ještě trochu upravil a přidal výpisy debug_backtrace(), což činí věci o něco jasnějšími. Vypadá to jednoduše tak, že volání instanční metody statickým způsobem, tj. B::privateWho() je naprosto totožné, jako volání $this->privateWho().
Vkládám zdrojový kód s komentáři, protože sandbox.onlinephpfunctions.com má debug_backtrace() z bezpečnostních důvodů zakázánu.
Vkládám zdrojový kód s komentáři, protože sandbox.onlinephpfunctions.com má debug_backtrace() z bezpečnostních důvodů zakázánu.
Kód: [Vybrat]
<?php
header("Content-Type: text/plain; charset=utf-8");
class A {
private function privateWho() {
debug_print_backtrace();
}
public function runFn($fn) {
debug_print_backtrace();
$fn();
}
public function testA() {
debug_print_backtrace();
$this->privateWho();
}
public function testB() {
debug_print_backtrace();
B::privateWho();
}
}
class B extends A {
public function testC() {
debug_print_backtrace();
B::privateWho();
}
}
$b = new B();
try {
#0 A->privateWho() called at [index.php:16]
#1 A->testA() called at [index.php:36]
$b->testA();
} catch (Error $e) {
echo $e->getMessage().PHP_EOL;
}
try {
#0 A->privateWho() called at [index.php:21]
#1 A->testA() called at [index.php:42]
$b->testB();
} catch (Error $e) {
echo $e->getMessage().PHP_EOL;
}
try {
#1 B->testC() called at [index.php:48]
$b->testC();
} catch (Error $e) {
# Call to private method A::privateWho() from context 'B'
echo $e->getMessage().PHP_EOL;
}
try {
#0 A->runFn(Closure Object ()) called at [index.php:56]
$b->runFn(function() {
B::privateWho();
});
} catch (Error $e) {
# Call to private method A::privateWho() from context ' '
echo $e->getMessage().PHP_EOL;
}