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

Zdravím, trochu jsem experimentoval s Late Static Bindings a zkoušel různé kombinace použití parent::, self:: a static::, až jsem se dostal k následující podivnosti, která mi neleze do hlavy. Jak je vůbec možné, že script neohlásí žádný warning a ani deprecated hlášku o statickém volání nestatické metody?
V konfiguraci PHP mám error_reporting nastaven na E_ALL. Díky za odpověď.
Kód: [Vybrat]
class A {

    private function privateWho() {
        echo __CLASS__.PHP_EOL;
    }

    public function test() {
        B::privateWho();           // static::privateWho();
    }

}

class B extends A {}


$b = new B();

$b->test();     // vytiskne A
« Poslední změna: 07. 03. 2018, 08:25:11 od bortomar »


Kit

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #1 kdy: 07. 03. 2018, 11:11:34 »
Ta metoda se jednoduše zavolá staticky, ničemu to nevadí. Problém by nastal teprve pokud by se snažila použít nějakou instanční proměnnou.

PHP není Java. Je vymakanější.

BoneFlute

  • *****
  • 2 010
    • Zobrazit profil
Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #2 kdy: 07. 03. 2018, 12:14:13 »
IMHO prostě chybka.

dev

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #3 kdy: 07. 03. 2018, 12:38:01 »
PHP není Java. Je vymakanější.

A VIM je vymakanější než IDEA.

jeTuNejakyTopic?

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #4 kdy: 07. 03. 2018, 13:03:50 »
Zdravím, trochu jsem experimentoval s Late Static Bindings...

Troufám si říct, že jste objevil bug v PHP. Minimálně v tom, že ani mírně rozšířený příklad nehodí error/warning:

Kód: [Vybrat]
<?php

class {

    private 
$a "adfs";

    private function 
privateWho() {
        echo 
$a "rwe";
        echo 
__CLASS__.PHP_EOL;
        
    }

    public function 
test() {
        
B::privateWho();           // static::privateWho();
    
}

}

class 
extends {}


$b = new B();

$b->test();     // vytiskne rweA


A to, že tomu nevadí volání přes B:: je fakt humus. :D


jeTuNejakyTopic?

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #5 kdy: 07. 03. 2018, 13:05:34 »
ten příklad beru zpět :D byla to krávovina...

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #6 kdy: 07. 03. 2018, 13:50:00 »
Zdravím, trochu jsem experimentoval s Late Static Bindings...
Troufám si říct, že jste objevil bug v PHP. Minimálně v tom, že ani mírně rozšířený příklad nehodí error/warning:

Nevím, jestli je to bug, pochybuju o tom, nicméně vaše rozšíření příkladu mě přivedlo k:

Kód: [Vybrat]
class A {
    private $a = "private ";

    private function privateWho() {
        echo $this->a.__CLASS__.PHP_EOL;   
    }
   
    public function test() {
        B::privateWho();   
    }
}

class B extends A {}

$b = new B();
$b->test();          // private A

Kit

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #7 kdy: 07. 03. 2018, 14:23:30 »
Tohle je také v pořádku, ovšem takové prasárny by se psát neměly.

Petr.

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #8 kdy: 07. 03. 2018, 16:01:11 »
Zdravím, trochu jsem experimentoval s Late Static Bindings...

Troufám si říct, že jste objevil bug v PHP. Minimálně v tom, že ani mírně rozšířený příklad nehodí error/warning:

Kód: [Vybrat]
<?php

class {

    private 
$a "adfs";

    private function 
privateWho() {
        echo 
$a "rwe";
        echo 
__CLASS__.PHP_EOL;
        
    }

    public function 
test() {
        
B::privateWho();           // static::privateWho();
    
}

}

class 
extends {}


$b = new B();

$b->test();     // vytiskne rweA


A to, že tomu nevadí volání přes B:: je fakt humus. :D

Mě to teda hodí chybu

Notice: Undefined variable: a in /tmp/test.php on line 8
rweA




Havran

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #9 kdy: 07. 03. 2018, 16:23:11 »
Skusajte tu http://sandbox.onlinephpfunctions.com/ a piste aj verziu PHP :-)

jeTuNejakyTopic?

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #10 kdy: 07. 03. 2018, 16:51:58 »

Mě to teda hodí chybu ...

Hned po odeslání jsem si uvědomil, že mi tam chybí $this-> (nějakou dobu jsem nepsal v PHP). Pokud by tam bylo, tak to nomrálně tu privátní proměnnou vypíše.

Ovšem další (alespoň pro mě) zajímavý příklad: :D

Kód: [Vybrat]
<?php

class {

    

    private function 
privateWho() {
        echo 
$this->a;
        echo 
$this->b;
        
    }

    public function 
test() {
        
B::privateWho();           // static::privateWho();
    
}

}

class 
extends {
    protected 
$a "aaaaaa";
    private 
$b "bbbbbb";
    
}


$b = new B();

$b->test();     // vytiskne aaaaaa a pak hodí Uncaught Error

tzn. nemá problém vypsat protected property třídy B :D

Kit

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

.

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #12 kdy: 07. 03. 2018, 18:11:49 »
A co přesně by na tom nemělo fungovat?!

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #13 kdy: 07. 03. 2018, 19:58:55 »
A co přesně by na tom nemělo fungovat?!

Minimálně bych očekával, že se interpretru jazyka nebudou podobné konstrukce zamlouvat a bude o jejich nevhodnosti autora informovat vhodnou hláškou.
Jde mi prostě o to, že použiju-li Potomek::soukromaMetodaRodice() byť v těle veřejné metody rodiče, snažím se o volání metody v kontextu třídy potomka, tedy se snažím volat překrývající implementaci metody v potomkovi, a není-li tam nalezena, použije se metoda rodiče, nebo je-li soukromá, jako v tomto případě, obdržím chybovou hlášku. Možná ale jen  dědičnost a modifikátory přístupu špatně chápu.

Re:PHP: Statické volání soukromé instanční metody rodiče
« Odpověď #14 kdy: 07. 03. 2018, 20:09:00 »
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í. :)
« Poslední změna: 07. 03. 2018, 20:14:44 od bortomar »