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

Operator "->" u PHP-u i inicijalizacija svojstava objekta

[es] :: PHP :: PHP za početnike :: Operator "->" u PHP-u i inicijalizacija svojstava objekta

[ Pregleda: 2465 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

sicko87
Nis

Član broj: 223670
Poruke: 62
212.178.236.*

Jabber: sicko@elitesecurity.org


+1 Profil

icon Operator "->" u PHP-u i inicijalizacija svojstava objekta06.09.2010. u 15:40 - pre 165 meseci
Dali neko moze da mi malo pojasni sledecu stvar:

Code:

$user = new Users;   // kreiranje instance klase Users

$user->imeFunkcije();  // pozivanje neke funkcije iz klase Users

$user->imeFunkcije()->ovoMiNijeJasno;



Video sam negde ovakvu strukturu,znaci $object->funkcija()->... pa mi nije jasno sta moze stajati iza ove druge strelice,dali se tako poziva neka funkcija ili promenljiva ili sta vec...?

Hvala unapred.

[Ovu poruku je menjao Goran Rakić dana 06.09.2010. u 20:13 GMT+1]

[Ovu poruku je menjao Goran Rakić dana 06.09.2010. u 22:34 GMT+1]
 
Odgovor na temu

Miroslav Ćurčić
ex mVeliki
Novi Sad

Član broj: 19034
Poruke: 1118
*.adsl.eunet.rs.



+19 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.06.09.2010. u 17:09 - pre 165 meseci
Metod imeFunkcije() može na svom kraju imati:
Code:
return $Objekt;
gde je $Objekat instanca neke druge klase pa u nizu zatim pozivaš metode te druge klase.

Napredna varijanta ovoga je slučaj kada metod vraća $this čime omogućavaš lančano vezivanje metoda istog objekta (chaining), naprimer: $Obj()->UradiNesto()->PaJosNesto()->IJosNesto(); umesto da svakom pojedinačnom metodu dodaš ispred: $Obj->
"The quieter you become, the more you are able to hear."
Blog | PowerCMS
 
Odgovor na temu

sicko87
Nis

Član broj: 223670
Poruke: 62
212.178.236.*

Jabber: sicko@elitesecurity.org


+1 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.06.09.2010. u 18:55 - pre 165 meseci
Hvala na odgovoru...

Ipak,ima nesto sto me zbunjuje,ovaj kod sam preuzeo iz CodeIgniter framework-a...

Code:

class Welcome extends MY_Controller {
function Welcome()
{
parent::MY_Controller();
}
function index()
{
$this->load->view('welcome_message');     // ovaj red me zbunjuje
}
}


Naime,po onome sto ste rekli trebalo bi da je ova rec "load" neka funkcija,ipak,nema standardan izgled funkcije npr. load().Kako se to objasnjava? Dali ima logike da je negde u podesavanjima promenjeno pa da ova prva funkcija u nizu ne mora da ima zagrade ili je pa nesto trece u pitanju...?
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.06.09.2010. u 19:11 - pre 165 meseci
Operator -> služi za pozivanje metode ili pristup svojstvu. Operator ima dva operanda. Levo od operatora je objekat, a desno ime svojstva (npr. $obj->my_name) ili poziv metode (npr. $obj->say_name()). Unutar objekta/klase metode su funkcije, svojstva su promenljive.

Levo od operatora ne mora da bude samo promenljiva koja ukazuje na objekat, već i bilo šta drugo što ima vrednost koja ukazuje na objekat.

Baš kao što možeš da napišeš get_number()+3. Ako funkcija get_number vraća ceo broj, na primer 5, to je isto kao da piše 5+3. Tako ako get_load() vraća neki objekat, pišemo get_load()->view().

Ili ako je objekat u svojstvu tekućeg objekta prvo primenimo operator -> da dođemo do vrednosti svojstva $this->load, a potom možemo opet da primenimo operator -> i poovemo neku njegovu metodu, u ovom slučaju $this->load->view(). Ako bi ova metoda vratila neki objekat, moglo bi i dalje $this->load->view()->some_method()...

Ne treba da te to zbunjuje, samo čitaj sleva nadesno prvi operand, operator, drugi operand. Pa sračunaj šta on vraća, pa onda dalje.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: Razlika izmedju grupisanja funkcija u klasu i pravilnije OOP programiranje.06.09.2010. u 19:12 - pre 165 meseci
Citat:
sicko87: Hvala na odgovoru...

Ipak,ima nesto sto me zbunjuje,ovaj kod sam preuzeo iz CodeIgniter framework-a...

Code:

class Welcome extends MY_Controller {
function Welcome()
{
parent::MY_Controller();
}
function index()
{
$this->load->view('welcome_message');     // ovaj red me zbunjuje
}
}


Naime,po onome sto ste rekli trebalo bi da je ova rec "load" neka funkcija,ipak,nema standardan izgled funkcije npr. load().Kako se to objasnjava? Dali ima logike da je negde u podesavanjima promenjeno pa da ova prva funkcija u nizu ne mora da ima zagrade ili je pa nesto trece u pitanju...?



Klasa My_Controller ima property load, npr.
Code:

class My_Controller extends nesto...
{
  protected $load ;
}


Ok, ovo je iz glave. U taj 'load' property je instanca neke klase, pa je zato linija $this->load->view(....) moguca. Nrp. ukucas $this->load = new Smarty() ili nesto slicno.

Druga varijanta je da mozda CI koristi magic metode za property-ije, pogledaj __get i __set cemu sluze gde $load property ne postoji, ali i dalje je ista poenta. $load je instanca neke klase.
 
Odgovor na temu

sicko87
Nis

Član broj: 223670
Poruke: 62
212.178.236.*

Jabber: sicko@elitesecurity.org


+1 Profil

icon Re: Operator "->" u PHP-u06.09.2010. u 19:34 - pre 165 meseci
Citat:

Operator -> služi za pozivanje metode ili pristup svojstvu. Operator ima dva operanda. Levo od operatora je objekat, a desno ime svojstva (npr. $obj->my_name) ili poziv metode (npr. $obj->say_name()). Unutar objekta/klase metode su funkcije, svojstva su promenljive.

Levo od operatora ne mora da bude samo promenljiva koja ukazuje na objekat, već i bilo šta drugo što ima vrednost koja ukazuje na objekat.

Baš kao što možeš da napišeš get_number()+3. Ako funkcija get_number vraća ceo broj, na primer 5, to je isto kao da piše 5+3. Tako ako get_load() vraća neki objekat, pišemo get_load()->view().

Ili ako je objekat u svojstvu tekućeg objekta prvo primenimo operator -> da dođemo do vrednosti svojstva $this->load, a potom možemo opet da primenimo operator -> i poovemo neku njegovu metodu, u ovom slučaju $this->load->view(). Ako bi ova metoda vratila neki objekat, moglo bi i dalje $this->load->view()->some_method()...

Ne treba da te to zbunjuje, samo čitaj sleva nadesno prvi operand, operator, drugi operand. Pa sračunaj šta on vraća, pa onda dalje.


Fenomenalno objasnjenje! Hvala puno.

Interesuje me samo,dali je ispravno napisati ovakav kod i ako nije - gde su greske ;)

Code:

<?php

class Science {

public $history = new History;

}

class History {

public function showInfo(){

echo "History is a beautifull science";

}

$science = new Science;

$science->history->showInfo();

?>


Hvala svima unapred.
 
Odgovor na temu

dakipro
Dalibor Jovic
Web Developer
Bergen, Norway

Moderator
Član broj: 31848
Poruke: 1792
...148.91.adsl.dyn.beotel.net.

Sajt: norway.dakipro.com


+190 Profil

icon Re: Operator "->" u PHP-u06.09.2010. u 19:56 - pre 165 meseci
Koristi editor sa syntax proverom, recimo ovo


public $history = new History;

pre ce biti

public $history = new History();

Ali je to otprilike to sto si pitao. A da bi bio siguran, probas pa vidis :)
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Operator "->" u PHP-u06.09.2010. u 20:56 - pre 165 meseci
Dalibore, nije to. Ako konstruktor objekta nema parametre, poziv bez () je dopušten.

Problem u ovom kodu je što u deklaraciji svojstva objekta možeš da inicijalizuješ samo konstantama. Objekat je instanca (primerak) klase. Kada želiš da napraviš primerak klase poziva se njen konstruktor. Ako ne definišeš konstruktor poziva se podrazumevani koji ne radi ništa vidljivo.

Da je klasa Science bila:
Code (php):
class Science {
  public $history = 5;
}

... onda bi PHP mogao prilikom instanciranja klase da dodeli vrednost 5 ovom svojstvu kako je zadato deklaracijom. To često skraćuje konstruktor jer ne moraš samo zbog toga da ga pišeš. Međutim to ne radi za složene tipove kao što je drugi objekat (ovde klase History) jer bi prvo on negde morao da se instancira, a u deklaraciji svojstava klase ne možeš da izvršavaš kod.

Zato definiši konstruktor klase Science koji će da postavi ovo svojstvo pri instanciranju klase Science:
Code (php):
class Science {
  public $history = null;
  public function __construct() {
    $this->history = new History;
  }
}


Dodatno nedostaje ti jedna zagrada koja bi zatvorila definiciju klase History. Nakon toga kod radi očekivano.

Pogledao sam sada u PHP Manualu, naravno da tamo sve piše, samo treba pažljivo čitati:
Citat:
http://www.php.net/manual/en/language.oop5.properties.php

This declaration may include an initialization, but this initialization must be a constant value--that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated.

http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

dakipro
Dalibor Jovic
Web Developer
Bergen, Norway

Moderator
Član broj: 31848
Poruke: 1792
...148.91.adsl.dyn.beotel.net.

Sajt: norway.dakipro.com


+190 Profil

icon Re: Operator "->" u PHP-u06.09.2010. u 21:07 - pre 165 meseci
Ha, nisam ni znao da moze da se napise
public $history = new History;

bez zagrada za klasu. Ako nesto radi, ne popravljam ga :)

Opet savet stoji, syntax highlight uz error reporting glavu cuvaju
 
Odgovor na temu

sicko87
Nis

Član broj: 223670
Poruke: 62
212.178.236.*

Jabber: sicko@elitesecurity.org


+1 Profil

icon Re: Operator "->" u PHP-u06.09.2010. u 21:31 - pre 165 meseci
Citat:
... onda bi PHP mogao prilikom instanciranja klase da dodeli vrednost 5 ovom svojstvu kako je zadato deklaracijom. To često skraćuje konstruktor jer ne moraš samo zbog toga da ga pišeš. Međutim to ne radi za složene tipove kao što je drugi objekat (ovde klase History) jer bi prvo on negde morao da se instancira, a u deklaraciji svojstava klase ne možeš da izvršavaš kod.


...zapravo,predpostavio sam da instanciranje mora da se izvrsi u konstruktoru ali rekoh da pitam ;) Predpostavljam da bez konstruktora moze da se svojstvu dodeli samo vrednost kao sto je recimo broj ili string a da ne mogu komplikovanije operacije da se izvrsavaju bez konstruktora,recimo da se svojstvu dodeli neka vrednost pomocu funkcije iz druge klase ili da se instancira...

Da i zaboravio sam onu jednu zagradu.Svejedno,sada mi je mnogo jasnije ovo sa povezivanjem metoda u lanac...


 
Odgovor na temu

narko
Pozarevac

Član broj: 92440
Poruke: 97
*.rcub.bg.ac.rs.



Profil

icon Re: Operator "->" u PHP-u i inicijalizacija svojstava objekta10.09.2010. u 12:58 - pre 164 meseci
Code:
class Science {
  public $history = null;
  public function __construct() {
    $this->history = new History;
  }
}


zar ne bi trebalo da stoji
Code:
public global $history = null;
tj zar ne bi trebalo da stoji rec global ili je to samo kada se radi proceduralno a ne objektno?
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Operator "->" u PHP-u i inicijalizacija svojstava objekta10.09.2010. u 13:07 - pre 164 meseci

public global ne znači ništa i nije dozvoljena konstrukcija (Parse error)

Dozvoljena vidljivost je public, private, protected: http://www.php.net/manual/en/language.oop5.visibility.php
Dodatno se kombinuje sa static odrednicom: http://www.php.net/manual/en/language.oop5.static.php

Global je ključna reč koja se koristi unutar metode/funkcije, a ne unutar deklaracije klase. Ako unutar neke funkcije/metode definišeš promenljivu kao global PHP će da je dohvati iz globalnog imenskog prostora.

Ovo je inače loša praksa, funkcije i metode ne bi trebalo da brljaju po globalnom imenskom prostoru bez jasno definisane potrebe. Sve piše u dokumentaciji: http://php.net/manual/en/language.variables.scope.php

http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

[es] :: PHP :: PHP za početnike :: Operator "->" u PHP-u i inicijalizacija svojstava objekta

[ Pregleda: 2465 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

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