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
- 1717 megtekintés
Hozzászólások
function __construct($nev, $kor, $jelszo);
ott egy fölösleges ;
- A hozzászóláshoz be kell jelentkezni
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 :)
- A hozzászóláshoz be kell jelentkezni
A pontosvesszőre mondta, hogy felesleges :)
- A hozzászóláshoz be kell jelentkezni
Ooops! Tényleg :) De ugyanaz az eredmény :((
- A hozzászóláshoz be kell jelentkezni
"Non-abstract method"
melyik szót nem érted?:)
http://php.net/manual/en/language.oop5.abstract.php
- A hozzászóláshoz be kell jelentkezni
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 :)
- A hozzászóláshoz be kell jelentkezni
nah akkor sorban:
33.sorban kommentezd ki a } jelet.
73.sorba tegyél egy } jelet.
A 28.sorból kommentezd ki a ; jelet.
..de aztán van még hiba, talán egyedül is megy;)
- A hozzászóláshoz be kell jelentkezni
ezek mind megtörténtek, de az eredmény ugyanaz.
A listaz() függvény nem szándékoztam az osztály függvényévé tenni.
- A hozzászóláshoz be kell jelentkezni
ugyanaz hogy hibát ír ki, vagy ugyanazt a hibát írja ki?
- A hozzászóláshoz be kell jelentkezni
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();
?>
- A hozzászóláshoz be kell jelentkezni
te jo isten...
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
még egyszer jelezném: a két osztályt nem én írtam, csak javítottam, hogy hiba nélkül fusson. az elvi hibákat a téma indítónak címezd léccci.:)
- A hozzászóláshoz be kell jelentkezni
Especiel a topicinditonak szantam. Tudod, akinek nem inge...
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
bocs, azt hittem beálltál gfs mellé alázni. meg úgy is van rajtam már egy ing:)
- A hozzászóláshoz be kell jelentkezni
pont nem ezen van a hangsuly, hanem azon, ami utana jon :)
mivel pontosvesszovel lezarta a deklaralast, ezert szolt neki php, hogy nincs a fuggvenynek torzse (es mivel ez egy nem-absztrakt fuggveny, kell neki)
- A hozzászóláshoz be kell jelentkezni
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..
- A hozzászóláshoz be kell jelentkezni
nem kell egyenlőnek lenni a hiba nélküli futáshoz.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
uramisten...
- A hozzászóláshoz be kell jelentkezni
latom szered az ilyen hozzaszolasokat :)
- A hozzászóláshoz be kell jelentkezni
:)
Csak ha ilyen alap dolgok nem tisztak valakinek, es 'kimasoltam a netrol a megfelelo mennyisegu underscore-t a konstruktor ele', akkor ott valami nagyon nincs rendben. Elobb kene az alapokat megtanulni, aztan urallomasvezerlot programozni :D
Rossz a sorrend.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
termeszetesen nem mindegy a tanulasi forras minosege! programozasi nyelv elsajatitasakor javallott a nyelv referenciajat bongeszgetni (esetunkben http://www.php.net/manual/en/)
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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 :)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
magyar nyelven létezik a könyv?
- A hozzászóláshoz be kell jelentkezni
En nem tudok rola, de elkepzelheto.
Mindenesetre ha jo angolul, akkor dobj egy pm-et.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Hat ennel tobbet :D
function __construct(/*$nev, $kor, $jelszo*/)//;
Es hasonlok.
Igen, valoban azt irta ki amit kellett, de arra egy echo eleg lett volna :D. Ugyanannyira rugalmas mint az altalad modositott kod, csak nem ganyolas.
Az 'uramistennel' nullat tanul, ezzel meg minuszt.
Udv
- A hozzászóláshoz be kell jelentkezni
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.....
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
tényleg nem. csak azt nem értettem, hogy származtatott osztály esetén miért nem this-vel hívod meg a szülő metódusait, miért hozol belőle létre új objketumokat. szerintem gondold át újra mit is szeretnél.
- A hozzászóláshoz be kell jelentkezni