OOP v PHP

Programovacie jazyky, rady, poradňa...
S.T.E.A.L.T.H
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 933
Registrovaný: 31 jan 2010, 14:44
Bydlisko: Pegasus Galaxy

OOP v PHP

Príspevok od používateľa S.T.E.A.L.T.H »

Zdravim koderov

Zacinam s OOP v PHP a narazil som na problem. Mam triedu (vid priloha class1.php). Nasledne chcem vytvorit dalsiu triedu (class2.php), ktora by mala byt zjavne asi extends triedy z class1, nakolko chcem pouzivat jej metody. Ked nasledne spravim

Kód: Vybrať všetko

$db_object = new Database("localhost", "root", "", "mike_db", 1);
$section_list = new SectionList($a);
print_r($section_list->getContent());
tak mi to vyhodi velke gulove. Nevie niekto poradit prosim, ako mam tento problem poriesit.
Prílohy
class.rar
(1018 Bajtov) 67 stiahnutí
Aiden
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2213
Registrovaný: 06 apr 2007, 14:28

Re: OOP v PHP

Príspevok od používateľa Aiden »

Nedal si prilohu :)
S.T.E.A.L.T.H
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 933
Registrovaný: 31 jan 2010, 14:44
Bydlisko: Pegasus Galaxy

Re: OOP v PHP

Príspevok od používateľa S.T.E.A.L.T.H »

viem, sorac, zabudol som na to a pokial som to opravil, tak si si to uz vsimol :)
*****HERO*****
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2446
Registrovaný: 08 máj 2006, 1:34

Re: OOP v PHP

Príspevok od používateľa *****HERO***** »

co je to ta premenna '$a' a kde ju mas definovanu?

zapni si error reporting, mozno ti pomoze.

Kód: Vybrať všetko

error_reporting(-1);
ini_set('display_errors', 1);

preco volas z funkcie getContent() konstruktora parenta? ten sa zavola sam, pri vytvarani instancie, pokial si ho neoverridujes.

preco vytvaras 2 instancie? nestaci ti nahodou len ta jedna - instancia tvojej odvodenej triedy?

mas zjavne este dost velke medzery v zakladoch, studuj ... ;)
Aiden
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2213
Registrovaný: 06 apr 2007, 14:28

Re: OOP v PHP

Príspevok od používateľa Aiden »

1. Aj ked zacinas s oop, urcite sa pozri na composer, ked kvoli nicomu inemu, tak kvoli pohodlnemu autoloadu tried.
2. Nepomenuvavaj subory ClassXY, ale podla toho, co za trieda v nich je... tj. Database.php, SectionList.php... rovnako aj metody pomenuvavaj deskriptivne... na dalsiu organizaciu potom pouzivaj namespaces + PSR-4 napriklad.
3. Cela ta SectionList trieda je velmi zle urobena. Ten konstruktor chces volat v kazdej dalsej metode, ktoru pridas?
Pridaj si constructor do SectionListu, ktory posunie parametre do parent constructoru, potom pouzivas priamo:

Kód: Vybrať všetko

$section_list = new SectionList("localhost", "root", "", "mike_db", 1);
print_r($section_list->getContent());
S.T.E.A.L.T.H
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 933
Registrovaný: 31 jan 2010, 14:44
Bydlisko: Pegasus Galaxy

Re: OOP v PHP

Príspevok od používateľa S.T.E.A.L.T.H »

Premenna $a je u-plne nepodstatna, len sa nou predava informacia z $_GET[], error mi tiez nepomoze, lebo tam error nie je, navyse errory zapnute mam. Ked spustim kod a dam si vypisovat print_r(); tak to zakape na

Kód: Vybrať všetko

if($qid = $this->query($sql)) {
, co sa da vystopovat az do metoy query(); a tu to skonci na

Kód: Vybrať všetko

if($this->query = mysqli_query($this->connection, $sql_query)) {
.

Aiden, povodne som tam ten konstruktor ani nemal, kedze zacinam, nevedel som ako to presne funguje, a ked som zistil, ze je potrebny, tak som ho vsunul, kde prislo :D Btw, pozrim sa na to :)
*****HERO*****
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2446
Registrovaný: 08 máj 2006, 1:34

Re: OOP v PHP

Príspevok od používateľa *****HERO***** »

ta premenna $a je v tvojom pripade praveze uplne podstatna, lebo nou nastavujes hosta na pristup do db s ktorou potom pracujes (viz. prvy argument konstruktoru triedy Database)

navyse ak by si ju nemal vobec definovanu, mohlo by to skapinat na noticke, preto ten error reporting


... ale to je fuk, Aiden ti to vysvetlil dobre ;)
S.T.E.A.L.T.H
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 933
Registrovaný: 31 jan 2010, 14:44
Bydlisko: Pegasus Galaxy

Re: OOP v PHP

Príspevok od používateľa S.T.E.A.L.T.H »

este raz, premenna $a je nepodstatna, ked ju zmazem, tak sa nic nezmeni, nenastavuje pristup do DB, pretoze ta cast kodu #whatever, vyzera nejako takto

Kód: Vybrať všetko

public function __construct($section, $pg = 1)	{
    if(!empty($section))	{
	$this->section = $section;
    } 
    else    {
        $this->exception = 'Section is not defined';
	return false;
    }
    if(is_numeric($pg))	{
	$this->pg = $pg;
    }
}
a momentalne je tam vlastne na rit funkcnosti. Z inicializacie vyplyva, ze nastavi permennu $section, nie pristup do db. Ked odstranim tento konstruktor, tym padom neinicializujem objekt s premennou $a, no napriek tomu metoda getContent() vrati tak akurat definovane pole $data v metode fetch_all_array();
*****HERO*****
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2446
Registrovaný: 08 máj 2006, 1:34

Re: OOP v PHP

Príspevok od používateľa *****HERO***** »

to mame odkial vediet, ze si prepisujes konstruktor :) ? ked uz tu davas priklad, tak snad komplet so vsetkym, s cim to moze suvisiet a nie ze "#whatever", lol ..

no pruser je prave v tom, ze z toho konstruktoru musis zavolat aj parent konstruktora, inak sa neinicializuje pripojenie na db.

cize takto nejak by to mohlo vyzerat

Kód: Vybrať všetko

public function __construct($section, $pg = 1)
{
    if (!empty($section)) {
        $this->section = $section;
    } else {
        $this->exception = 'Section is not defined';
        return false;
    }
    if (is_numeric($pg)) {
        $this->pg = $pg;
    }
    
    parent::__construct("localhost", "root", "", "mike_db", 1);
}
a pouzitie

Kód: Vybrať všetko

$section_list = new SectionList($section);
print_r($section_list->getContent());
takto by to teoreticky mohlo driapat, ak si nezamlcal dalsie "malickosti" ;)

inac par postrehov ...
- zabalil si do tej svojej triedy pristup do DB - nejde nastavit zvonku. nebolo by lepsie z hladiska znovupouzitelnosti, keby si to mal parametrizovane :) ?
- v konstruktore mas return false - to by som nepouzival. konstruktor vzdy vrati instanciu danej triedy bez ohladu na to, co sa snazis explicitne vratit ty. cize ak by to nastalo, objekt by sa normalne vytvoril a tvaril by sa, ze je vsetko v poriadku. ty mu sice vnutorne nastavujes do atributu 'exception' nejaku hlasku, ale jednak k nemu nema pristup kod zvonku a aj keby, tak by si ten atribut pri kazdej akcii musel kontrolovat. co tak tu exception vyhodit rovno? ( http://php.net/manual/en/language.exceptions.php )
S.T.E.A.L.T.H
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 933
Registrovaný: 31 jan 2010, 14:44
Bydlisko: Pegasus Galaxy

Re: OOP v PHP

Príspevok od používateľa S.T.E.A.L.T.H »

Pfuuu...takto to uz slape. Prepokladal som, ze ak z akejkolvek casti kodu zavolam nejaku funkciu parentu, tak to musi ist, ale zle som predpokladal, preto mu neprisiel ten extends konstruktor dolezity :D, sorac.
K tym postrehom.
-povodne som si povedal, ze idem daco skodit, ale ze uz ne proceduralne, ale objektovo, tak co prve, mal som funckie na mysql pripojenei, tak som to vsetko prepisal. To som ale nevedel, ze ked dojde na pristup do DB z inej triedy, tak nebudem vediet co s tym. Extendeol som to a jo, nenapadlo mi, ze to z vonku nekillnem :(
-s tym return false som to tak isto nevedel

Btw, otazka. Okrem konstruktora mozem akukolvek inu parent funkciu volat kdekolvek v extendnutej triede? Preco knstruktor parentu musi byt volany v konstruktore exntendu, aby to slo ako ma?
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: OOP v PHP

Príspevok od používateľa harrison314 »

*****HERO***** v konstruktore nema co hladat return
S.T.E.A.L.T.H
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 933
Registrovaný: 31 jan 2010, 14:44
Bydlisko: Pegasus Galaxy

Re: OOP v PHP

Príspevok od používateľa S.T.E.A.L.T.H »

*****HERO***** to vie, to len ja som to nevedel.
*****HERO*****
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2446
Registrovaný: 08 máj 2006, 1:34

Re: OOP v PHP

Príspevok od používateľa *****HERO***** »

harrison314 napísal:*****HERO***** v konstruktore nema co hladat return
:happyrespect:
S.T.E.A.L.T.H napísal:Pfuuu...takto to uz slape. Prepokladal som, ze ak z akejkolvek casti kodu zavolam nejaku funkciu parentu, tak to musi ist, ale zle som predpokladal, preto mu neprisiel ten extends konstruktor dolezity :D, sorac.
K tym postrehom.
-povodne som si povedal, ze idem daco skodit, ale ze uz ne proceduralne, ale objektovo, tak co prve, mal som funckie na mysql pripojenei, tak som to vsetko prepisal. To som ale nevedel, ze ked dojde na pristup do DB z inej triedy, tak nebudem vediet co s tym. Extendeol som to a jo, nenapadlo mi, ze to z vonku nekillnem :(
-s tym return false som to tak isto nevedel

Btw, otazka. Okrem konstruktora mozem akukolvek inu parent funkciu volat kdekolvek v extendnutej triede? Preco knstruktor parentu musi byt volany v konstruktore exntendu, aby to slo ako ma?


preco? lebo konstruktor nie je funkcia ako ine. konstruktor sa vola iba raz za zivot objektu a to jedine hned po jeho instanciovani. sluzi na to, aby proste pripravil objekt na pouzivanie - inicializuje premenne, co mozu byt kludne aj dalsie zavisle objekty a pod.

okrem konstruktora su este v PHPku nejake vynimky, ktore by sa nemali zavolat len tak cez keyword parent, tie ta ale zatial trapit nemusia :)
Aiden
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2213
Registrovaný: 06 apr 2007, 14:28

Re: OOP v PHP

Príspevok od používateľa Aiden »

@S.T.E.A.L.T.H Viacmenej kazdu funckiu parenta mozes volat, aj ten konstruktor. Akurat v tomto pripade, to vobec nedavalo zmysel. Tu si si potreboval zavolat consturtor parenta, aby si sa s tou tvojou triedou dokazal pripojit do DB. Cize nakolko cela fukcnionalita tej tvojej triedy zavisi na pripojeni k DB, zavolat parent consturor dava zmysel priamo v konstruktore extendnutej triedy.
S.T.E.A.L.T.H
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 933
Registrovaný: 31 jan 2010, 14:44
Bydlisko: Pegasus Galaxy

Re: OOP v PHP

Príspevok od používateľa S.T.E.A.L.T.H »

Budem studovat, dik moc chlapci za pomoc :)
Aiden
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2213
Registrovaný: 06 apr 2007, 14:28

Re: OOP v PHP

Príspevok od používateľa Aiden »

Kludne zacni aj tuto. Zaklady su tam jasne vysvetlene :)
Napísať odpoveď