Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Sta znaci parent:: u ovoj klasi?

[es] :: PHP :: Sta znaci parent:: u ovoj klasi?

[ Pregleda: 2832 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.87.243.*



+4 Profil

icon Sta znaci parent:: u ovoj klasi?18.11.2009. u 01:21 - pre 175 meseci
Imam sledecu klasu:
Code:

class myPDO extends PDO{
...
public function query($sql){
$this->last_query=$sql;
try
{
    $stmt=parent::query($sql);
}
catch(PDOException $e)
{    $m="\t PDO Query Error: ".$e->getMessage().'<br />';
    $m.="\t Last query: ".$this->last_query;
    trigger_error($m,E_USER_ERROR);
}
if(!$stmt) // ovo se uvek javlja kad je error. bilo da je ermode 0,1,2
{    $m="\t PDO Query Error: <pre>".print_r(parent::errorInfo(),TRUE).'</pre><br />';
    $m.="\t Last query: ".$this->last_query;
    trigger_error($m,E_USER_ERROR);
}

return $stmt; //return PDOStatement object
} // end f query($sql)
}
Mahinalno sam koristio parent::query() da bih se posluzio originalnom funkcijom query koju ovde overrajdujem uz ubedjenje da je query staticki deklarisan metod. I to je radilo. Select, insert, update, sve sljaka. Pozelim da to isto uradim i za errorInfo i citam u dokumentaciji da moram da koristim $conn->errorInfo(); Kako da ubacim $conn u samu klasu koja pravi tu $conn?!?
$conn = new myPDO();

Onda shvatim da ni query nije staticna funkcija i da i ona mora da se zove $conn->query()! Jer ako napisemo PDO::query($sql), dobijemo sledeci error:
>>>Fatal error: Non-static method PDO::query() cannot be called statically in...
Ok, ako mora preko instance, zasto onda radi sa parent::query()?
Zasto parent::errorInfo() takodje radi? Lepo izbaci error array ako napravim sql gresku.

U dokumentaciji kaze da se parent koristi kad zelim da pristupim nekoj f koju overrajdujem... A ovde ispada da pristupam toj funkciji + dobijam $conn vrednost. Zasto?
$conn je za sada bio singleton, da li to ima neke veze? Sta ce se desiti kad/ako napravim 3-4 instance?
Ima li neko ko moze ovo da mi pojasni?


I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
91.148.87.*



+13 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 08:57 - pre 175 meseci
Sorry, ali ja stvarno ne mogu da skontam sta si ti pitao (a procitao sam 3 puta ceo post, majke mi :P :P).

Elem, kao sto si i sam vec video, "parent::" sluzi da pristupis metodi (metodama)/polju nad-klase iskljucivo iz Sub-Klase (klase koja nasledjuje neku nadklasu). Ti kad override-ujes neku metodu, ti skrivas taj isti metod iz NadKlase i ne mozes da mu pristupis nikako. Bas zato se koristi parent::, koji sasvim logicno kaze: pristupi parent (roditeljskoj - klasi koju nasledjujem) metodi i uradi nesto korisno

Code:


class NadKlasa {
  public function __construct()
  {
     echo 'Konstruktor iz Nad-klase';
  }

  public function test()
  {
    echo 'Test metoda iz Nad-Klase';
  }
}

class SubKlasa extends NadKlasa
{
  public function __construct()
  {
    echo 'Konstruktor iz SubKlase';
    parent::__construct(); // Pozovi konstruktor iz Nad-Klase
  }
  

  public function test() // Override-ujemo metodu iz NadKlase
  {
    echo 'Test metoda iz Sub-Klase';
    parent::test(); // Pozovi istu metodu iz Nad-klase
  }

}


Mada ti je ovo vec bilo jasno, al dobro ... Nego, i dalje ne mogu da skontam sta si ti jos pitao, tj. sta ti nije jasno tacno oko ovog $conn (sta god on bio ? ) Aj probaj da preformulises malo
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-3.sezampro.rs.



+33 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 09:10 - pre 175 meseci
Tebe izgleda zbunjuje to što je sintaksa pozivanja nadređene metode ista kao kad pozivaš statičku, odnosno imaš te dve vezane dvotačke, posle parent - parent::foo().
 
Odgovor na temu

agvozden
Aleksandar Gvozden
founder
Info-G
Beograd

Član broj: 37813
Poruke: 1123
*.b92.net.

Sajt: www.gvozden.info


+68 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 11:00 - pre 175 meseci
@Man-Wolf

Citat:
parent::__construct();


Jel' stvarno koristis poziv na __construct necega sto bi vec trebalo da bude odradjeno?
Ajd' mi reci neki konkretan primer koriscenja tako neceg...
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.87.243.*



+4 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 11:25 - pre 175 meseci
Citat:
agvozdenJel' stvarno koristis poziv na __construct necega sto bi vec trebalo da bude odradjeno? Ajd' mi reci neki konkretan primer koriscenja tako neceg...
Mislim da na ovo mogu i ja da odgovorim :) U lynda kursu je receno da moras da koristis
__construct(){parent::__construct();} jer ce se startovati samo konstruktor tvoje klase a ne i klase od koje nasledjujes.

I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
91.148.87.*



+13 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 11:25 - pre 175 meseci
@agvozden - Mislim da nisam koristio do sad, ali, ne razumem zasto ne bih ? I sta podrazumevas pod "sto bi trebalo vec da bude odradjeno" ?

Konkretan primer? Pa evo, pade mi na pamet ovako nesto opste:

Code:

class Figura
{
    private $sirina;
    private $duzina;

    public function __construct($sirina, $duzina)
    {
        $this->sirina = $sirina;
        $this->duzina = $duzina;
    }
    
}

class Kocka extends Figura
{
    public function __construct($sirina, $duzina)
    {
        parent::__construct($sirina, $duzina);
    }
}


:-)

EDIT: Kao sto pomenu MilosDJ, imas slucajeva kada je obavezno da pozoves parent konstruktor, kada nasledjujes klasu. Primer: CodeIgniter. Kada pravis MODEL npr, moras obavezno da pozoves konstruktor parent-a, tj:

Code:


class Form_lists extends Model {

    function Form_lists()
    {
        // Call the Model constructor
        parent::Model();
    }

 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.87.243.*



+4 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 11:47 - pre 175 meseci
Da pojasnim:
Ukapirao sam da sa parent:: mogu da pozovem i staticke i obicne metode. Ovo je skroz jasno:
<?PHP
$connection = new PDO();
$connection->query($sql);
$connecton->errorInfo
?>
Tu sam instancirao PDO i dobio objekat $connection. Je l' tako? Tako je
Nad tim $connecton ja radim/pozivam odredjene metode query(), errorInfo(). To je sve jasno.

Ali, ako to isto uradim u klasi,
Code:
class myclass extends PDO{

public function query(){

parent::query();
parent::errorInfo();
}
...jasno mi je da sam pozvao parent query, tj query od originalne PDO klase.
Ali mi nije jasno kako parent:: zna koja je to konekcija sa bazom koju treba da koristi. Odakle mu informacija da sam ja hteo $connection->parent::query; Sa sve dbname, username, pass i ostalim parametrima te $connection.

Jos mi je cudnije da errorInfo radi, sto znaci da parent:: osim sto poziva originalno nasledjen metod
dobija informaciju o konekciji sa bazom, pravilno uzima errorCode i prikazuje ga.

Otkud parent:: zna da sam ja instancirao myclass? I odakle mu informacije o $connection instanci?
Koje ocigledno mora da poseduje da bi uopste znao da je doslo do nekog errora. Sam ::errorInfo() nema odakle da uzme podatke o erroru, ili gresim.

I onda ide pitanje, da li to radi jer imam samo jednu konekciju ka bazi (singleton)?


p.s. morao sam onako brzo da odgovorim na agvozdenovo pitanje jer mi se pruzila jedinstvena prilika da i ja malo pomognem
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
91.148.87.*



+13 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 12:23 - pre 175 meseci
@MilosDj - Zbunio si se malo

Vidi ovo:

Code:


class Test
{
  public function nekaFja()
  {
     $this->drugaFja();
  }

  public function drugaFja()
  {
    // Nesto korisno ...
  }

  public function testing()
  {
    // Opet nesto korisno ...
  }
}


Ovo ti je jasno, je l' ? Znaci iz jedne metode u klasi pozivas drugu ... To su sve metode jednog objekta (Test), tako ?

E sad, nista drugacije nije kad imas:

Code:

class SubTest extends Test
{
  public function nekaFja()
  {
    parent::testing();
  }
}



Ti imas jedan objekat, koji poseduje metode iz nasledjene klase (Test) (naravno, pod uslovom da su metode tipa public/protected). Znaci, teoretski ti i dalje radis nad jednim objektom, koji je dobio gene od nekog drugog objekta :-D

Btw, primetio sam da stalno provlacis ovo "$connection". $connection ti nije objekat, nego on samo pokazuje na objekat. Tacnije, ti kad uradis:

Code:

$test = new SubTest();


... ti u dinamickom delu memorije pravis novi objekat SubTest() i u $test promenljivu samo smestas referencu na kreirani objekat (zato se kaze da on - $test (u ovom slucaju) - pokazuje na SubTest() ).

Slikovito, to ti je nesto ovako:



Suma sumare: Ti kad pozivas "parent::query()", ti teoretski radis nad jednim objektom u memoriji (tj. skoro isti slucaj kao prvi primer koji sam naveo) i to nema nikakve veze sa "$connection" referencom koju pominjes

Nadam se da sam ti bar malo razjasnio (ili da si bar delimicno razumeo sta sam pokusao da kazem :-D)

 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.87.243.*



+4 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 13:12 - pre 175 meseci
Ako sam te dobro razumeo:

Tvoja slika u narandzastom delu bi morala da ima jos jednu parent::nekaFja()
Jer objekat SubTest koji referenciras preko $test ima override. Da ili Ne?


U slucaju slike $test->nekaFja() = parent::nekaFja()
Onda u mom slucaju, predpostavljam da sama PDO klasa ubelezi podatke o svojoj konekciji na heap. Pa onda $connection->errorInfo() i u klasi parent::errorInfo() postaju istovetni. Da ili ne?

Onda takodje moram da predpostavim da query interno uzima podatke o konekciji sa bazom. Tj sa heap mesta rezervisanog za taj objekat.

Sto znaci ako napravim dve instance myclass extends PDO sa razlicitim parametrima (username, pass) ja cu na heapu imati dva objekta, svaki sa svojim podatcima o konekciji. I onda se parent::query odnosi na deo u mem rezervisan preko date reference.

Ako nisam pogresio u onome sto sam pisao dobro je! Ovaj model mi je razumljiv.
Kao da PDO klasa ima neke protected vars gde upisuje connection i ostale parametre, koje onda koriste query, errorInfo itd...

Hvala mnogo!
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
91.148.87.*



+13 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 13:50 - pre 175 meseci
Citat:
MilosDj
Tvoja slika u narandzastom delu bi morala da ima jos jednu parent::nekaFja()
Jer objekat SubTest koji referenciras preko $test ima override. Da ili Ne?


Da, ovaj ceo objekat je logicki podeljen na dva dela: SubTest i Test, tako da ti ako hoces da pristupis metodi "nekaFja" od Test, moras da koristis "parent::".

Sto se tice PDO klase, zamisli da je ovo neka njena uproscena implementacija:

Code:


class PDO
{

  private db_reference;
  private error_info; 
  
  // Konstruktor
  public __construct()
  {
    $this->connectToDb(); // Uspostavi konekciju sa bazom
  }

  private function connectToDb()
  {

    if (!$this->db_reference)
      $this->db_reference = mysql_connect(......);
    else
      return;

   }

  public function query($query)
  {
    $query = mysql_query($this->db_reference, $query) or (upisi neku gresku u $error_info);
    return $query;
   }

  public function errorInfo()
  {
    return $this->error_info;
  }


Znaci, on u sebi sadrzi sve podatke koji su mu potrebni za povezivanje, s tim sto su oni deklarisani kao private i ne mozes da im pristupis (secas se enkapsulacije koju je pominjao Poša vise puta ? :-) )

E sad, dva nacina koja ti pominjes:

1.

Code:

$pdo = new PDO();

$pdo->query(neki query);


I na ovaj nacin ti si odradio neki query, i dobio si sta si dobio,... Elem, ovo ti je vec poznato.

Upravo istu stvar ti radis kad pozivas:

Code:

parent::query()


Znaci, pozivas metodu iz nad-klase PDO i izvrsavas neki query. Jedina razlika je sto je ovde pozivas iz neke sub-klase (koristis parent::), a gore pozivas ovu metodu preko reference ($pdo).

Citat:
MilosDj
Onda u mom slucaju, predpostavljam da sama PDO klasa ubelezi podatke o svojoj konekciji na heap.

Da, upravo tako. Kao sto mozes videti iz moje improvizovane klase, nesto slicno se dogadja i u PDO klasi ...

Btw, nemoj toliko da se obazires sad na HEAP. To sam sve pomenuo samo da bi razumeo da -- $conn -- predstavlja samo referencu na objekat ... :-) Ono sto ti treba da shvatis jeste da klasa PDO u sebi cuva "ZATVORENE" podatke (samo ona moze da im pristupi) i jedan od tih podataka je upravo connection handler.

Citat:
MilosDj:
Pa onda $connection->errorInfo() i u klasi parent::errorInfo() postaju istovetni. Da ili ne?


Upravo :-)

Citat:
MilosDj:
Sto znaci ako napravim dve instance myclass extends PDO sa razlicitim parametrima (username, pass) ja cu na heapu imati dva objekta, svaki sa svojim podatcima o konekciji. I onda se parent::query odnosi na deo u mem rezervisan preko date reference.


Bas tako :-)

Citat:
MilosDj:
Ako nisam pogresio u onome sto sam pisao dobro je! Ovaj model mi je razumljiv.
Kao da PDO klasa ima neke protected vars gde upisuje connection i ostale parametre, koje onda koriste query, errorInfo itd...


Tacnije - "private", ne "protected" :-)




 
Odgovor na temu

agvozden
Aleksandar Gvozden
founder
Info-G
Beograd

Član broj: 37813
Poruke: 1123
*.b92.net.

Sajt: www.gvozden.info


+68 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 14:45 - pre 175 meseci
@Man-Wolf sorry, zbrzgao sam malo... :)
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.87.243.*



+4 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 14:58 - pre 175 meseci
Eeeeee, sad mi je sve jasno!
U pocetku sam googlao sa upitom pdo properties ali nista nisam dobio osim nekih bug reporta. I prerano zakljucio da PDO nema properties... Veoma ishitreno sa moje strane.

Sad je veoma razumljivo ZASTO query, errorInfo i vecina ostalih NIKADA ne mogu da budu staticke metode. Prvo mora da ide __construct koji ce da se poveze sa bazom, napravi $dbh koje ce da koriste ostale metode....
Pa cak i obican quote ne sme da bude statican... Jer je PDO namenjen pristupu vise razlicitih baza a quoting nacin moze da se razlikuje od baze do baze! Nice

A parent::query() u klasi moze da bude isto kao i $pdovar->query() jer se query oslanja na svoj interni $dbh!!!
Hvala, hvala, hvala Bas lepo sto mi je to promaklo kad sam citao dokumentaciju Zna li neko gde moze da se nadje model/izgled PDO klase? Tipa properties, kako izgledaju njene metode itd. Naleteo sam na podatak da je ceo PDO uradjen u C++ i da je zato prilicno brz.

Srecom pa sam poceo sa pogresnim uverenjem da pdo ima staticne metode
I onda se nasao u cudu kako mi radi metoda


Oooo da! Moj previd u kucanju:
Private - vidi se samo u ovoj klasi.
Protected - ova klasa + deca koja extends ovu klasu.
Public - vidi se svuda.

Huh! To je znaci enkapsulacija na delu! Evo i wiki enkapsulacija ako nekome zatreba
U stvari, da nema enkapsulcije ja bih rucno morao da ubacujem parent::$dbh u svaki query...

I jedno teoretsko pitanje:
Da li je "private" izmisljen bas za enkapsulaciju? Jer trenutno ne vidim ni jedan drugi razlog da postoji.


p.s. Hvala svima na pomoci, posebno Man-Wolf!
p.p.s. Ako neko zeli da nauci da plese, samo nek se javi na pp. Ima licno da vam pokazujem korake
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-4.sezampro.yu.



+33 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 15:33 - pre 175 meseci
Kad nekog člana klase, bilo promenljivu ili metod označiš kao private, biće mu omogućen pristup jedino unutar klase u kojoj je deklarisan, čak ni izvedene klase neće moći da mu pristupaju. I da, glavni razlog je opet ta enkapsulacija, jer ćeš nekad imati npr. ovakav slučaj: imaš apstraknu klasu (ili ne mora da bude apstraktna) određene namene, koja sad ima neke metode, a u tim metodama koristiš neki drugi, pomoćan metod, za kojeg hoćeš da zabraniš klasama koje se izvode iz te tvoje da ga "čačkaju" i menjaju, jer eto on mora da bude takav kakav jeste i nema potrebe da ga ostale klase custom-izuju. Logičan potez je da taj metod označiš kao privatan. Tačnije, na taj način izvedene klase neće uopšte imati predstavu da taj metod postoji. Drugi način da zabraniš tu izmenu, redefinisanje, kako god, nekog metoda je klauzula final.
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
*.dynamic.sbb.rs.



+13 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 23:00 - pre 175 meseci
Citat:
MilosDj:
U stvari, da nema enkapsulcije ja bih rucno morao da ubacujem parent::$dbh u svaki query...


Nisi bas najbolje razumeo pojam enkapsulacije Enkapsulacija (ili sto je jedan kolega "pametno odvalio" da ga to asocira na "konzerviranje (konzerva - konzerviranje)) ti je princip (postulat, sta god) koji govori o zatvaranju podataka u klasu. Kad bolje razmislis, to je i logicno, jer, zasto bi neko s polja imao pristup nekim poljima/metodama koje mu nisu od interesa/znacaja

Citat:
MilosDj:
p.s. Hvala svima na pomoci, posebno Man-Wolf!


Nema na cemu, i drugi put


Citat:
MilosDj:
p.p.s. Ako neko zeli da nauci da plese, samo nek se javi na pp. Ima licno da vam pokazujem korake


:-D

P.S. Preporucio bih ti da pogledas Javin tutorial o OOP-u ... Sigurno ces dosta bolje razumeti ceo princip/koncepte OOP-a

Link: http://java.sun.com/docs/books/tutorial/java/index.html (naravno, neke lekcije se ticu Jave konkretno, tako da to slobodno zaobidji)

Pozdrav!
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.87.243.*



+4 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 23:14 - pre 175 meseci
Citat:
Man-Wolf:
Enkapsulacija (ili sto je jedan kolega "pametno odvalio" da ga to asocira na "konzerviranje (konzerva - konzerviranje)) ti je princip (postulat, sta god) koji govori o zatvaranju podataka u klasu. Kad bolje razmislis, to je i logicno, jer, zasto bi neko s polja imao pristup nekim poljima/metodama koje mu nisu od interesa/znacaja
Da, upravo to! Da PDO nije konzervirao svoj $database handle ja bih rucno morao da ga ubacijem u svaki query.
Pa bi to bilo u klasi parent::query($sql,parent::$dbh); ili $conn->query($sql,$conn->$dbh);

Ali posto je sve to konzervirano ja do pre par sati nisam ni znao da PDO ima svoje properties koje ocigledno obilato koristi Samo je sve radilo a ja se pitao kako i zasto

Btw, kako se na srpskom kaze class property?
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: Sta znaci parent:: u ovoj klasi?18.11.2009. u 23:41 - pre 175 meseci
Citat:
MilosDj:..Btw, kako se na srpskom kaze class property?

Na našem se zovu polja ili atributi, i spadaju u clanove klase(members)...
 
Odgovor na temu

[es] :: PHP :: Sta znaci parent:: u ovoj klasi?

[ Pregleda: 2832 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.