| 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: 17 let
|
|||
0