Autor | Zpráva | ||
---|---|---|---|
mmako Profil * |
#1 · Zasláno: 5. 10. 2008, 11:26:50
zdravím, jaký je mezi tím rozdíl ? :-/
$this->funkce() self::funkce() |
||
BetaCam Profil |
#2 · Zasláno: 5. 10. 2008, 11:52:12
mmako
„$this->funkce() “ Je instanční volání „self::funkce()“ Je volání statické |
||
mmako Profil * |
#3 · Zasláno: 5. 10. 2008, 13:12:19
co když budu používat self:: všude ?
|
||
BetaCam Profil |
#4 · Zasláno: 5. 10. 2008, 14:09:06 · Upravil/a: BetaCam
mmako
„co když budu používat self:: všude ?“ No to můžeš, u metod ti to projde, ale podle mě je to jen zanášení bordelu do třídy. 1) na první pohled není vidět jestli se metoda statická nebo instanční. 2) nelze použít self:: pro přístup k nestatickým vlastnostem takže se $this stejně nevyhneš. 3) pokud budeš přistupovat staticky k instančním metodám z venku třídy tak to bude vyhazovat E_STRICT |
||
Časová prodleva: 7 dní
|
|||
mmako Profil * |
#5 · Zasláno: 12. 10. 2008, 11:39:13
pokud dědím fnce po abstraktní třídě tak se používá na jejich volání self:: ? (parent:: ? )
|
||
BetaCam Profil |
#6 · Zasláno: 12. 10. 2008, 12:48:19 · Upravil/a: BetaCam
mmako
„pokud dědím fnce po abstraktní třídě tak se používá na jejich volání self:: ? (parent:: ? )“ <?php error_reporting(E_ALL); abstract class a{ abstract public function iTestA(); public function iTestB(){ echo 'testB<br />'; } public static function sTestB(){ echo 'sTestB<br />'; } public function iTestC(){ echo 'testC<br />'; } public static function sTestC(){ echo 'sTestC<br />'; } } class test extends a{ public function iTestA(){ echo 'testA<br />';} public function iTestB(){ echo 'overTestB<br />';} public function ioriginalTestB(){ parent::iTestB(); } public static function soriginalTestBStrict(){ parent::iTestB(); } public static function sTestB(){ echo 'oversTestB<br />';} public static function soriginalTestB(){ parent::sTestB(); } public function oiTestC(){ $this->iTestC(); } public function osTestC(){ self::sTestC(); } public function callInClassTest(){ $this->iTestA(); $this->iTestB(); $this->ioriginalTestB(); self::soriginalTestBStrict(); // Strict self::sTestB(); self::soriginalTestB(); $this->iTestC(); // Original self::sTestC(); // Original } public static function callInClassTestStatic(){ //$this->iTestA(); // Error //$this->iTestB(); // Error //$this->ioriginalTestB(); // Error self::soriginalTestBStrict(); // Strict self::sTestB(); self::soriginalTestB(); // $this->iTestC(); // Original // Error self::sTestC(); // Original } } $test = new test(); $test->itestA(); $test->itestB(); $test->ioriginalTestB(); test::soriginalTestBStrict(); test::sTestB(); test::soriginalTestB(); $test->oiTestC(); $test->osTestC(); echo '<hr>'; $test->callInClassTest(); echo '<hr>'; test::callInClassTestStatic(); ?> |
||
BetaCam Profil |
#7 · Zasláno: 12. 10. 2008, 13:19:32 · Upravil/a: BetaCam
Ještě drobné vysvětlivky, protože jak koukám nenapsal sem to zrovna moc přehledně.
Volání statických metod předka ve statických i instančních metodách potomka : Metoda předka : parent::metoda(); Metoda předka zděděná nepřekrytá : self::metoda(); Překrytá metoda předka : self::metoda(); Volání instančních metod předka ve statických metodách potomka : V určitých případech funguje : parent::metoda() či self::metoda() ovšem v žádném případě to nedoporučuji a naopak doporučuji vyhnout se jakému koli volání instančních metod v metodách statických Volání instančních metod předka v instančních metodách potomka : Metoda předka : parent::metoda(); Metoda předka zděděná nepřekrytá : $this->metoda(); Překrytá metoda předka : $this->metoda(); Doufám, že sem to někde nepomotal. :) |
||
Časová prodleva: 16 let
|
0