Osztálymetódos meghívása példányosítás nélkül
Épp a statikus osztálymetódusokról olvasgattam, amikor egy érdekes dolgot vettem észre:Itt ugye szépen kiírja a várt szöveget, ami rendben is van: statikus tagfüggvénynél működik a példányosítás nélküli függvényhívás.
Azonban ha kihagyom a static kulcsszót a függvény meghatározásából, akkor is meg lehet azt hívni objektumpéldány nélkül. Tehát kvázi direktben lehet hívni egy osztálymetódust (amelyik persze public vagy protected), anélkül, hogy mondjuk a konstruktor is automatikusan lefutna.Csak nekem fura ez a viselkedés?:)
■
class Foo {
public static function bar() {
print 'Egy bar vagyok.';
}
}
print Foo::bar();
Azonban ha kihagyom a static kulcsszót a függvény meghatározásából, akkor is meg lehet azt hívni objektumpéldány nélkül. Tehát kvázi direktben lehet hívni egy osztálymetódust (amelyik persze public vagy protected), anélkül, hogy mondjuk a konstruktor is automatikusan lefutna.
class Foo {
public function __construct() {
throw new Exception('Itt le kéne állni!');
}
public function bar() {
print 'Egy bar vagyok.';
}
}
//$foo = new Foo();
print Foo::bar();
Kompatibilitas
PHP 5 eseten ha a script hibak be vannak kapcsolva, akkor egy nem statikusnak deklaralt metodus statikus hivasa eseten E_SCRIPT hibat fogsz kapni, de ettol fuggetlenul mukodni fog. Persze a staikusan hivott metodusban torteni $this hasznalat tovabbra is fatal errort vagy erdekes viselkedest fog eredmenyezni.
E_STRICT, nem
Tyrael
Hubasszus, ennyire faradt
Azért volt nekem gyanús,
előttem már megválaszolták a
echo gyorsabb Mikor mérted
echo
ésprint
között.echo
több paramétert is elfogad, ezért megspórolhatsz néhány fölösleges karakterlánc összeillesztést.my 2 cents: echo nyelvi
echo nyelvi konstrukcio, nem fuggveny, emiatt valoban gyorsabb egy hangyanyit:
http://codepad.viper-7.com/Vp0bLC 3 opcode
vs
http://codepad.viper-7.com/gMY1Lw 2 opcode
a masik kovetkezmenye ennek, hogy az echo-nak nincs visszateresi erteke (pontosabban nem hasznalhato olyan kornyezetben).
azt hiszem mindent elmondtunk rola, amit tudni lehet. :)
Tyrael
A print se függvény
Az echo-nak nincs visszatérési értéke a print-nek meg van. Ebből adódik a különbség.
/o\ es tenyleg,
a gyakorlatban a ZEND_PRINT is a ZEND_ECHO-t hajtja vegre, csak a beallitja a visszateresi erteket konstans 1-re, es visszater vele:
http://lxr.php.net/opengrok/xref/PHP_TRUNK/Zend/zend_vm_def.h#973
Tyrael
Az előbb, igaz egy virtuális
Szóval én nem láttam érzékelhető különbséget a két parancs sebességében.
(ubuntu 10.04 default telepítés, nem tudom mennyire van optimalizálva a php-je. Nem lennék meglepve, ha kiderülne, hogy miután nem használom a visszatérési értéket, egyszerűen az optimalizáló echo-t tesz a print helyére)
Szerintem korábban a print
én is úgy tudtam, hogy
"Szép" sorozat!
Akkor már vegyük bele
Egyébként nem értem, hogy ennek az egésznek mi a jelentősége, én egyszer szoktam kimenetre tolni adatot: ha elküldöm a választ a kliensnek...
Nekem furcsa
print Foo::bar();
-al hívod a függvényt. Nem kell a print, mivel a fv-ben ott van. CsakFoo::bar();
.Először is köszönöm a
Másrészt az észrevétel jogos, a válasz pedig a figyelmetlenség.
Nem értem, hogy mi vezetett
"akkor a statikus metódusokat
uhm, what?
marmint aki ellenjavalja a statikus metodusokat, az altalaban a Singleton pattern it, hiszen a getInstance() ott is egy statikus metodus.
es ugye a statikus metodusokat a global state es az implicit dependencia miatt nem szeretjuk, az ilyen kodot nehezebb tesztelni (reszletekert lasd ezt illetve ezt )
Tyrael
marmint aki ellenjavalja a
Jóva, nem kell szőrszálhasogatni :D (Egyébként gondoltam, hogy beleírom, hogy az Instance metódust leszámítva, de szerintem így is érthető a cél, ha valaki tisztában van azzal a mintával ...)
Nekem sajna nem sikerült megúszni a php-t singleton nélkül. (Mondjuk csak egy helyen használom, a többinél sikerült elkerülni kis utánagondolással.)
tradeoff, szerintem van olyan
ettol fuggetlenul a jelenlegi trendek azt mutatjak, hogy a PHP frameworkokben is mindenki igyekszik a DI/DIC fele mozogni, pl. anno a Symfony is tele volt Singleton-okkal, de a Symfony2-be mar mindenutt DIC-t hasznalnak, amennyire tudom, Zend Framework detto, 2-es verzioban ok is DIC-re tertek at, es a Singleton-okat lekukaztak.
ps: nyilvan egy framework eseteben sokkal fontosabb, hogy rugalmas es jol tesztelheto legyen, szoval itt nagyobb haszna is van a DI-nek, de az alkalmazas fejlesztok is kovetni fogjak a trendeket.
Tyrael
Mit jelent?
dependency injection
arra gondoltam, igen. Tyrael
Tyrael
Köszi
Hogy érted azt, hogy "így"?
A legelső PHP-könyvemben (kb. 7 éve, azóta kihagytam vagy 4 évet) a szerző a printet használta, nekem meg ez maradt meg. De lehet, hogy az echo valóban jobb.
Hogy érted azt, hogy "így"?
Hát passz, nekem mondjuk az furcsa, hogy a parent::method is ugyanígy kettőspontokkal működik...
Teljesen mindegy melyiket használod, garantálom, hogy soha az életben nem lesz érezhető különbség a kettő között...
Mondjuk megintcsak érdekes, hogy 3 féleképpen lehet kimenetre adatot küldeni. Én fix, hogy csak az egyiket hagytam volna meg ezek közül. (Nekem az output stream-re mentés a szimpatikus egyébként.)
[qoute]Hát passz, nekem
Nalátod!:)