PHP: Statické volání soukromé instanční metody rodiče

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #15 kdy: 07. 03. 2018, 20:20:37 »
Na StackOverflow jsem narazil na podobný dotaz


v

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #16 kdy: 07. 03. 2018, 20:31:07 »
V čem je problém? Takových zbytečných ptákovin se dá vymyslet...

Já chápu, že je to nesmyslná konstrukce a blbost, která nemá se skutečným programováním mnoho společného, ale já se jednoduše snažím i v blbostech hledat logiku, což je asi mým prokletím. :(
Omlouvám se tedy za "znečišťování" fóra podobnými nonsensy. Příště se tomu pokusím vyhnout. Díky za pochopení. :)
osobně považuju váš dotaz za zcela legitimní

Kit

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #17 kdy: 08. 03. 2018, 10:12:23 »
V čem je problém? Takových zbytečných ptákovin se dá vymyslet...

Já chápu, že je to nesmyslná konstrukce a blbost, která nemá se skutečným programováním mnoho společného, ale já se jednoduše snažím i v blbostech hledat logiku, což je asi mým prokletím. :(
Omlouvám se tedy za "znečišťování" fóra podobnými nonsensy. Příště se tomu pokusím vyhnout. Díky za pochopení. :)

Doporučuji při takových pokusech zapnout všechna chybová hlášení, včetně noticek. Odpoví na mnoho otázek.

Nebýt takových šťouralů, svět by byl dokonalý ... a strašně nudný. Díky za takové dotazy.

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #18 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.

Kód: [Vybrat]
<?php 
header
("Content-Type: text/plain; charset=utf-8");

class 
{
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 
extends {  
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;
}
« Poslední změna: 09. 03. 2018, 14:16:26 od bortomar »