ugrás a tartalomhoz

OOP Constructor oroklodese

zoliky · 2008. Aug. 27. (Sze), 15.42
Kezdo vagyok OOP teren. Elolvastam par dokumentaciot, de valamit nem igazan ertek! Itt van a kovetkezo kod:

class ShopProduct {
   public $title;
   public $producerMainName;
   public $producerFirstName;
   public $price;

   function __construct( $title, $firstName, $mainName, $price ) {
       $this->title = $title;
       $this->producerFirstName = $firstName;
       $this->producerMainName = $mainName;
       $this->price = $price;
   }

   function getProducer() {
       return "{$this->producerFirstName}". " {$this->producerMainName}";
   }

   function getSummaryLine() {
       $base = "{$this->title} ( {$this->producerMainName}, ";
       $base .= "{$this->producerFirstName} )"; 
       return $base;
   }
}
es itt van a gyerek (child) class amely orokol mindent a ShopProduct-tol. A constructort is orokli!
Na most en szeretnek egy sajat consztruktort letrehozni a gyerek class-ban.
class CdProduct extends ShopProduct {
	public $playLength;
	
	function __construct($title, $firstName, $mainName, $price, $playLength) {
		parent::__construct($title, $firstName, $mainName, $price);
		$this->playLength = $playLength;
	}
	
	function getPlayLength() {
		return $this->playLength;
	}

}
Azt nem ertem, hogy miert kell ertesiteni a szulot a kovetkezo kodal ?
parent::__construct($title, $firstName, $mainName, $price);
Ha nem ertesitem a gyerek elveszti azokat a constructor adatokat amiket orokol az apatol?
Koszonom!
 
1

RTFM

Max Logan · 2008. Aug. 27. (Sze), 15.50
PHP: Constructors and Destructors

Note: Parent constructors are not called implicitly if the child class defines a constructor. In order to run a parent constructor, a call to parent::__construct() within the child constructor is required.

Tehát automatikusan nem hívódik meg a szülő konstruktora.
2

ok

zoliky · 2008. Aug. 27. (Sze), 16.05
Koszi!
3

OOP elv megsertese

zmb · 2008. Aug. 27. (Sze), 19.59
Off: Soha, de soha deklaraljal tagvaltozot publikus lathatosaggal. Senkinek semmi koze, hogy egy objektum hogyan, es milyen adatokat tarol magaban.
4

mert te

Fraki · 2008. Aug. 27. (Sze), 23.21
„Azt nem ertem, hogy miert kell ertesiteni a szulot a kovetkezo kodal ?”

Mert te tudod, hogy a származtatott konsturktorban mikor akarod meghívni a szülő konstruktorát (elején/végén), ez esetfüggő.
5

illik a szülő konstruktorát meghívni először

Hodicska Gergely · 2008. Aug. 28. (Cs), 00.53
Általában illik kapásból meghívni a szülő konstruktorát (fordítotja igaz a destruktorra). A konstruktor feladata, hogy inicializálja az adott objektumot. Az öröklés az ősosztály működését bővíti ki, ha nem egyből a szülő konstruktorát hívod meg, akkor a kód egy nem inicializált (nem konzisztens állapotban lévő) objektummal fog dolgozni.

Ezért bizonyos nyelvek esetén (ha jól rémlik, akkor talán C++, de ebben bőven nem vagyok bizots) a fordító sír is, ha nem az első sor az ős konstruktotának meghívása, vagy automatikusan meghívja, ha nem az lenne (pl. java, ha van paraméter nélküli konstruktora az ősnek).


Üdv,
Felhő