PHP5 - konstruktor probléma öröklésnél

Sziasztok!
A procedurális PHP4-el már foglalkozom egy jóideje, de az OOP-vel és a PHP5-el csak most ismerkedek.
Találtam egy példát a "PHP fejlesztés felsőfokon (PHP5)" című könyvben az osztályok öröklődésére. Ki is próbáltam:


<?php
   class User
   {
      public $name;
      public $birthday;
      
      public function ______construct($name, $birthday)
      {
         $this->name = $name;
         $this->birthday = $birthday;
      }
 
      public function hello()
      {
         return "Hello $this->name!\n";
      }

      public function goodbye()
      {
         return "Goodbye $this->name!\n";
      }
      
      public function age()
      {
         $ts = strtotime($this->birthday);
         if( $ ts === -1)
         {
            return "Unknown";
         }
         else
         {
            $diff = timeO - $ts;
            return floor($diff/(24*60*60*365)) ;
         }
      }
}

$user = new User('george', '10 Oct 19 7 3 ' );
echó $user->hello();
echó "You are ".$user->age()." years old.\n";
echó $user->goodbye();
?>

Majd íme a könyvben szereplő második osztály:


class AdminUser extends User
{
   public $password;
   public function _____ construct($name, $birthday)
   {
      parent::__ construct($name, $birthday);
      $db= dba_popen("/data/etc/auth.pw", "r", "ndbm");$this->password = dba_fetch($db, $name);
      dba_close($db);
   }
   
   public function authenticate($suppliedPassword)
   {
      if($this->password === $suppliedPassword) {
      return true;
      }
      else
      {
         return falsé;
      }
   }
}

----------------------------------

Ezek alapján próbából írtam én is két osztályt:


<?php
	class Tanulo
	{
		public $nev = "";
		public $kor = 0;
		
		function __construct($nev, $kor)
		{
			$this->nev = $nev;
			$this->kor = $kor;
		}
		
		function korNoveles()
		{
			$this->kor += 1;
		}
		
		function nevValtoztat($nev)
		{
			$this->nev = $nev;
		}
	}
	
	class TanuloAuth extends Tanulo
	{
		public $jelszo = "";
		
		function __construct($nev, $kor, $jelszo);
		{
			parent::__construct($nev, $kor);
			$this->jelszo = $jelszo;
		}
	}
	
	function listaz($tomb)
	{
		echo "<table border=\"1\">";
		foreach($tomb as $elem)
		{
			echo "<tr><td>";
			echo "Név: <b>".$elem->nev."</b><br>";
			echo "Kor: ".$elem->kor."<br>";
			echo "</td></tr>";
		}
		echo "</table>";
	}
	
	function listaz2($tomb)
	{
		echo "<table border=\"1\">";
		foreach($tomb as $elem)
		{
			echo "<tr><td>";
			echo "Név: <b>".$elem->nev."</b><br>";
			echo "Kor: ".$elem->kor."<br>";
			echo "Jelszó: ".$elem->jelszo;
			echo "</td></tr>";
		}
		echo "</table>";
	}
	//------------------------------
	$obj[] = new Tanulo("Dani", 19);
	$obj[] = new Tanulo("Zsófi", 18);
	$obj[] = new Tanulo("Dorka", 22);
	$obj[] = new Tanulo("Dávid", 22);
	
	listaz($obj);
	
	$obj3[] = new Tanulo("Andi", 18, "jelszo");
	$obj3[] = new Tanulo("Judit", 18, "jelszo");
	$obj3[] = new Tanulo("Éva", 19, "jelszo");
	$obj3[] = new Tanulo("Tina", 20, "jelszo");
	
?>

Amint lefuttatom, a következő hibaüzenet fogad:
Fatal error: Non-abstract method TanuloAuth::__construct() must contain body in C:\XAMPP\xampp\htdocs\php5\obj1.php on line 28

A gond ezzel a sorral van:

parent::__construct($nev, $kor);
  • Mivel tudnám mégis örököltetni a konstruktort, úgy hogy a származtatott osztályban is működjön egy kibővített konstruktor?
  • Miért nem működik nekem a könyvben ismertetettek alapján?

Köszi.
MysteryKe.

-----------
XAMPP 1.7.3
PHP 5.3.1
Apache: Apache 2.2.14

Hozzászólások

function __construct($nev, $kor, $jelszo);

ott egy fölösleges ;

butaságokat beszélek.... a gond ott kezdődik, hogy a származtatott osztályban deklarálom __construct() függvényt....

miért fölösleges a

$jelszo

paraméter a konstruktorba? pont ezért származtattam az osztályt :)

az "absztrakció" nekem még új :)
De akkor a szerzőnek mitől absztrakt? :)

szerk:
"absztrakt:
Elvont, elméleti, gondolati. A valóság összefüggéseivel nem törődő, a szokásos formákat megbontó.

absztraktum:
vázlat, kivonat"

Mostantól minden nap tanulok egy új szót :)

Tessék:

<?php
class Tanulo
{
public $nev = "";
public $kor = 0;

function __construct($nev, $kor)
{
$this->nev = $nev;
$this->kor = $kor;
}

function korNoveles()
{
$this->kor += 1;
}

function nevValtoztat($nev)
{
$this->nev = $nev;
}
}

class TanuloAuth //extends Tanulo
{
public $jelszo = "";

function __construct(/*$nev, $kor, $jelszo*/)//;
{
//parent::__construct($nev, $kor);
//$this->jelszo = $jelszo;
$obj[] = new Tanulo("Dani", 19);
$obj[] = new Tanulo("Zsófi", 18);
$obj[] = new Tanulo("Dorka", 22);
$obj[] = new Tanulo("Dávid", 22);

$this->listaz($obj);

$obj3[] = new Tanulo("Andi", 18, "jelszo");
$obj3[] = new Tanulo("Judit", 18, "jelszo");
$obj3[] = new Tanulo("Éva", 19, "jelszo");
$obj3[] = new Tanulo("Tina", 20, "jelszo");
}
//}

function listaz($tomb)
{
echo "";
foreach($tomb as $elem)
{
echo "";
echo "Név: ".$elem->nev."";
echo "Kor: ".$elem->kor."";
echo "";
}
echo "";
}

function listaz2($tomb)
{
echo "";
foreach($tomb as $elem)
{
echo "";
echo "Név: ".$elem->nev."";
echo "Kor: ".$elem->kor."";
echo "Jelszó: ".$elem->jelszo;
echo "";
}
echo "";
}
//------------------------------

}

new TanuloAuth();

?>

Es mi a vegeredmenye?

Amugy meg... nem ertem a listaz fuggvenyeket, szerintem feleslegesek oda.


class TanuloAuth { 
// ...
   function listaz() {
      echo "Neve: " . $this->nev . "\n"; // Vagy " ", de ures sztringet felesleges....
      echo "Kora: " . $this->kor . "\n";
      echo "Jelszava: " . $this->jelszo . "\n"; 
   }
// ...
}

Legyszi, legalabb valamilyen alapveto OOP konyvet nezz at, mielott nekivagsz tokeletes idiotasagokat irni...

--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Hali,

azert nem megy, mert egy fv-t a parameterei is meghataroznak.
Szoval a ket konstruktorod nem egyenlo.
Javaslom csinald ezt:

class Tanulo
{
public $nev = "";
public $kor = 0;

function __construct($nev, $kor, $jelszo = "")
{
$this->nev = $nev;
$this->kor = $kor;
}
......

igy mennie kell..

Hello!

Lehet hogy hülyeséget fogok írni akkor oltsatok le nyugodtan. Én egyszer hasonlóan avval szívtam meg egy konstruktor írásánál hogy nem raktam elé megfelelő mennyiségű "_" jelet ezért állandóan panaszkodott. Persze amikor néztem a kódot nem láttam hogy ez lenne a hiba és majd kifolyt a szemem.Aztán véletlenül valami php oldalon kerestem rá a konstruktor írásra és csak simán be másoltam az alulvonásokat és utána meggyógyult a kód. Hátha te is ezt nyalod be még a pontosvesszőn kívül.

Üdv.

Hello!

Most nem azért ,de mint feljebb olvasható volt hogy a fórum indító is megjegyezte hogy az általa használt könyvben is változó mennyiségű "_" volt a konstruktor elött. Ebben az esetben elég nehéz igazságot tenni hogy melyik is a helyes használat. Amúgy amikor tanulgattam a php-t akkor a 24 óra alatt könyvet nézegettem és ott is előfordult hogy hol így hol úgy nézett ki a példa kód.Szóval ebből kiindulva azért nem feltétlenül kell ebből messzemenő következtetéseket levonni.
Üdv.

Igen, de ez nem azt jelenti, hogy peldakat kell keresni ilyen esetekre a neten, hanem azt, hogy el kell menni a nyelv dokumentaciojaba, es megnezni, hogy ott mit irnak. A nyelv (es a parser) fejlesztoi mar csak jobban tudjak akarmelyik mezei halandonal, hogy mit eszik meg a rendszer konkretan!
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

A hibauzenet, mint mar leirtak paran a pontosvesszo miatt van. Nem tul bonyolult hibauzenet. Ha azt kivetted, es meg szar, akkor kozben valami mas valtozas is tortent. Ha ugyanazt a hibauzenetet kaptad a ; nelkul, akkor jelenleg egy masik programnyelvben dolgozol.

tényleg ugyanazt a hibaüzenetet kaptam rá:
"Fatal error: Non-abstract method TanuloAuth::__construct() must contain body in C:\XAMPP\xampp\htdocs\php5\obj1.php on line 28"

De pgabor megoldása működött :) http://hup.hu/node/83131#comment-957310 Köszi még1x :)
Nagyon idegen még számomra az OOP. De igyekszem tanulni és gyakorolni.

Egyébként ez a könyv mennyire vált be annak, aki ismeri? Az alulvonások egyébként a könyvben is változó előfordulásokkal szerepel a construct() függvény előtt :)

Valami megsem ugyanaz akkor. Mivel ; nelkul nem volt hiba itt.
A Fatal error: Non-abstract method TanuloAuth::__construct() must contain body hibauzenet meg azt jelenti, hogy must contain body.
function foo(); - nincs body
function(){} - van body

pgabor 'kodja' mukodik, de ekkora ganyt reg lattam :)
Nem attol lesz OOP valami, hogy a fuggvenyeket berakod egy class-be. Ennek amit irt, gyakorlatilag semmi ertelme nincs.
Kiirja, hogy 'Név: DaniKor: 19Név: ZsófiKor: 18Név: DorkaKor: 22Név: DávidKor: 22', de ennyi erovel ennyit is irhattal volna:
<?php echo 'Név: DaniKor: 19Név: ZsófiKor: 18Név: DorkaKor: 22Név: DávidKor: 22'; ?>

Masra nem jo.

Nem ismerem azt a konyvet, de a construct elott minden esetben 2 underscore all. Es nem valtozik. Ha mast irsz, akkor mas fuggveny, es nem konstruktor.
__construct helyett a ___construct ugyanolyan mint a __konstrukt.
A '_' is karakter...

Egyebkent ha valami ertelmeset is akarsz tanulni, akkor:
Kevin McArthur: Pro PHP

bests

már bocs, de a forrást nem én írtam. csak módosítottam, hogy ne legyen hibaüzenet és azt csinálja amit a kérdező szeretett volna eredetileg: kiírni a bevitt tartalmat. A fentebb beillesztett kód nem megfelelő megoldás, csak hibátlan. Távol álljon tőlem, hogy bármiről meggyőzzelek, az uramistenjóistentejóistenszűzmárjámból biztos többet fog tanulni. Én itt ki is szálltam.

tegnap már elég fáradt voltam, így most vettem csak észre ezt a sort:

class TanuloAuth //extends Tanulo

így már nem származtatott osztály lesz.....