Autor Zpráva
mmako
Profil *
zdravím, jaký je mezi tím rozdíl ? :-/

$this->funkce()
self::funkce()
BetaCam
Profil
mmako
$this->funkce()

Je instanční volání

self::funkce()

Je volání statické
mmako
Profil *
co když budu používat self:: všude ?
BetaCam
Profil
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
mmako
Profil *
pokud dědím fnce po abstraktní třídě tak se používá na jejich volání self:: ? (parent:: ? )
BetaCam
Profil
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
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. :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0