Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

PHP5, STATIC members/methods & Inheritance - Ne, ne ... :-(

[es] :: PHP :: PHP5, STATIC members/methods & Inheritance - Ne, ne ... :-(

[ Pregleda: 1785 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
*.dynamic.sbb.rs.



+13 Profil

icon PHP5, STATIC members/methods & Inheritance - Ne, ne ... :-(15.09.2010. u 02:30 - pre 165 meseci
Pozz,

Nisam siguran da li je vec bila slicna tema, ako jeste, izvinjavam se unapred.

Elem, izgubih, pa sta znam, dobrih - 30-60-90min, lupajuci glavu zasto ovaj kod:

Code (php):

class A
{
     
     public static function getMe()
     {
          self::buildMe();
     }

     public static function buildMe()
     {
          echo "Building from Class A";
     }
}

class B extends A
{
     public static function buildMe()
     {
          echo "Building from Class B";
     }
}
 


Vraca ovakve rezultate:

Code (php):

A::getMe(); // "Building from class A" (ocekivano)
B::getMe(); // "Building from class A" (wtf ? lol !)
 


Generalno, kao sto moze da se zakljuci, ono sto bi smo ocekivali da dobijemo kao rezultate - nazalsost ne dobijamo.
Zasto ? Hebo mater ... Uspeo sam cak da procitam da su drugari iz PHP-a cak to i obrazlozili - zasto to ne radi kako bi trebalo, itd itd. (nazalost, nisam uspeo da nadjem).

Nasao sam par workaround-a, od kojih je jedan tipa:

Code (php):

class A
{
     
     public static function getMe($class = __CLASS__)
     {
          call_user_func(array($class, 'buildMe'));
     }

     public static function buildMe()
     {
          echo "Building from Class A";
     }
}

class B extends A
{
     public static function buildMe()
     {
          echo "Building from Class B";
     }
}
 


Kad se ovako odradi, onda su rezultati u redu:

Code (php):

A::getMe(); // "Building from class A" (ocekivano)
B::getMe(); // "Building from class B" (ocekivano)
 


Ali, opet, heh .... Izgleda odvratno, posebno u slucaju kad metoda MORA da primi jedan ili vise parametara. Hebeno moram da napisem u komentarima - "Ni slucajno ne saljite poslednji parametar, ignorisite ga, on je tu samo zato sto je PHP glu.... gotivan :-)".

Misljenja ? Ideje ? :-)

Iskreno, mislim da cu pre da u kompletu prepisem metodu u klasi B, nego da se igram sa call_user_func() and friends ....

EDIT:

Zaboravih da navedem nekoliko zanimljivih izvora (na osnovu kojih sam srecom zakljucio da nisam poludeo, srecom):

http://socket7.net/article/php-5-static-and-inheritance
http://bugs.php.net/bug.php?id=42681
http://bugs.php.net/bug.php?id=28442
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: PHP5, STATIC members/methods & Inheritance - Ne, ne ... :-(15.09.2010. u 02:58 - pre 165 meseci
self ne radi isto sto i $this, tj. ne ide u child klase vec vidi samo trenutnu i parent klase. To sto ti hoces je 'Late static binding' koji postoji od verzije 5.3.0
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
*.dynamic.sbb.rs.



+13 Profil

icon Re: PHP5, STATIC members/methods & Inheritance - Ne, ne ... :-(15.09.2010. u 03:02 - pre 165 meseci
Ok, sad tek videh "Late Static Bindings" - (http://uk.php.net/oop5.late-static-bindings) ... Napravili su s**nje sa "self", pa je najbolji nacin uvesti nesto novo, kako bi se ispeglali problemi ... :S

Srecom pa je ovo uvedeno tek od PHP v5.3.0 ....

[Ovu poruku je menjao Man-Wolf dana 15.09.2010. u 04:21 GMT+1]

EDIT: Sorru @mitke013, nisam uopste skontao tvoju poruku :S Da, kao sto rekoh - videh Late Static Binding, al, opet - dzabe kad je uveden od v5.3.0 .... :-)

[Ovu poruku je menjao Man-Wolf dana 15.09.2010. u 04:22 GMT+1]
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-3.sezampro.yu.



+33 Profil

icon Re: PHP5, STATIC members/methods & Inheritance - Ne, ne ... :-(15.09.2010. u 09:59 - pre 165 meseci
Klauzula static nije zamena za self i predviđena je upravo za potrebe statičkog izvođenja. Imaj na umu da ključna reč static NIJE $this za statičke metode, kao što ćeš pročitati/čuti na mnogim mestima jer se ona NE vodi pravilima izvođenja, npr.:
Code:
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); //Koristimo static, ali...
    }
}

class B extends A {
   //Ovde nismo redefinisali metod who()
}

B::test(); //Ispisuje "A" bez obzira što smo koristili static!

Ne treba da te čudi takvo ponašanje statičkih članova, neko će me ispraviti, ali mislim da je slična situacija i u Javi. Npr. još jedna osobina te "statike" jeste da su statički članovi zajednički za sve instance neke klase i izmenom jednog od njih vršiš izmenu i za svaku instancu, npr.:
Code:
class A 
{
    protected static $_foo = 'bar';

    public static function setFoo($val)
    {
        self::$_foo = (string)$val;
    }
    
    public static function getFoo()
    {
        return self::$_foo;
    }
}

$a1 = new A();
$a2 = new A();

$a1->setFoo('test');

echo $a1->getFoo(); //test
echo $a2->getFoo(); //test
echo A::getFoo(); //test
 
Odgovor na temu

[es] :: PHP :: PHP5, STATIC members/methods & Inheritance - Ne, ne ... :-(

[ Pregleda: 1785 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.