[ slavo.k @ 16.01.2014. 23:16 ] @
Pozdrav. Imam klasu u kojoj sam izmedju ostalih deklarisao jednu public promenljivu. Ta public promenljiva je niz koji se u okviru neke metode napuni odredjenim podacima. Kako mogu sada iz bilo koje druge metode ispisati vrednost te promenljive. Pokusao sam na par nacina, ali ne uspevam.
[ Ivan_988 @ 17.01.2014. 07:18 ] @
Ovako nesto mozda?

Code:

class ClassName {
    public $arrayName;

    public function fillArray() 
    {
        // napuni niz
    }

    public function getArray()
    {
        print_r($this->arrayName);
    }
}


Ili

Code:

class ClassName {
    public $arrayName;

    public function fillArray() 
    {
        // napuni niz
    }

    public function getArrayElement($name)
    {
        echo $arrayName[$name];
    }
}
[ Nemanja Avramović @ 17.01.2014. 11:17 ] @
Ček, nisam siguran šta tačno pitaš. Ako već imaš klasu kao recimo ovu koju je opisao Ivan, public promenljivoj možeš pristupiti ovako:

Code:
$obj = new ClassName(); 
//... ovde kod koji puni niz, npr $obj->fillArray();

//pristupanje
var_dump($obj->arrayName);

//traversing..
foreach ($obj->arrayName as $item) {
  var_dump($item);
}
[ Ivan Stojmenovic Ikac @ 04.02.2014. 12:48 ] @
Mozes koristiti malo savremenije principe programiranja sto se toga tice.

Probaj raditi PHP Overloading.

Primer:
Code:

<?php

     class FooClass 
     {
            /**
             * Handler - nosac podataka
             *
             *@var array
             */

              public $data = array();

             /**
              * Get 
              */

               public function __get($name) {
                     if (array_key_exists($name, $this->data)) {
                          return $this->data[$name];
                     }
              }

             /**
              * Set
              */

            public function __set($name, $value) {
                  $this->data[$name] = $value;
            }

            /**
             * Primer 2
             * Bez get i set mozes i na ovaj nacin
             */

              public function showStats($data) {
                   if(is_array($data)) {
                        $this->data = $data;
                        foreach($this->data as $key => $value) {
                             echo $key .' = '.$value . '<br>';  // Nije dobra praksa echo u klasi
                             // return $value
                             }
                        }
                  }
     }

     // Primer sa get i set

     $foo =  new FooClass();
     $foo->name = "administrator";
     $foo->email = "[email protected]";
     $foo->password  = "1233445";
     
     // Primer 2 bez get i set

     $bar = new FooClass();
     $data = array('user' => 'administrator',
                   'email' => '[email protected]',
                   'password' => '123324534'
                );
     $bar->showStats($data);
     
     // >> debug

     echo "<pre>";
        var_dump($foo);
     echo "</pre>";
?>


Debug:
Code:
user = administrator
email = [email protected]
password = 123324534

object(FooClass)#1 (1) {
  ["data"]=>
  array(3) {
    ["name"]=>
    string(13) "administrator"
    ["email"]=>
    string(14) "[email protected]"
    ["password"]=>
    string(7) "1233445"
  }
}


Vise o overloading mozes pogledati na : http://www.php.net/manual/en/language.oop5.overloading.php

[Ovu poruku je menjao Ivan Stojmenovic Ikac dana 04.02.2014. u 16:56 GMT+1]
[ slavo.k @ 12.02.2014. 18:09 ] @
Hvala, ovo mi je dosta pomoglo. izvinite na kašnjnejnu.
[ VladaSu @ 13.02.2014. 12:47 ] @
Moje misljanje je da _get i _set treba izbegavati i koristiti ih samo kada nema drugi nacin da se resi problem ili je resenje mnogo komplikovano bez tih magicnih metoda.

[ Ivan Stojmenovic Ikac @ 16.02.2014. 11:27 ] @
Pa one su izmisljene da olaksaju zivot programera :D
[ VladaSu @ 17.02.2014. 09:07 ] @
Konkretno kako su tebi olaksale? Moze li neki primer?
Ja cu tebi navesti primere kako su meni zagorcali zivot jer nisu pisani kada i gde treba :)

Mnoge stvari su izmisljene da olaksaju zivot programera ali se kroz njihovo koriscenje utvrdilo da je efekat suprotan, pogotovo ako se ne koriste za sta su i namenjene.

Ako imas klasu user i setujes username, password, birthday sa magicnim metodama i onda neko dodje da nastavi tvoj kod on nema pojima
sta sve ima ta user klasa. Kada gleda klasu on ne vidi sta sve ima klasa vec mora da prodje ceo kod. A ako kod ima par miliona linija onda je to divota.
Da li je username ili user_name ili name? Nije nemoguce nastaviti takav kod ali se pisanje nastavlja sa pretpostavkama sto i nije neko programiranje koje mora da bude precizno.
Za tebe je to super ali razmisli kako je drugima ili tebi ali posle par godina.

Ako user klasa oslikava tabelu u bazi onda mogu da naslutim koja su polja ali mi niko ne garantuje da tu nema jos dodatih polja sem ako klasa nije striktno namenjena da oslikava
strukturu db tabele. Tu vec moze da ima smisla.


[ alfa-pro @ 24.02.2014. 10:57 ] @
Da to nevalja nebi ga ni izmislili. Ako nisi siguran sta je tamo neki Pera ili Mica pisao po celom App source-u u Front controlleru pogledaj koji su to!
Code:

$class_vars = get_class_vars(get_class($my_class));


ili dump-uj neku klasu pa da vidis
[ Predrag Supurovic @ 24.02.2014. 11:10 ] @
Citat:
VladaSu:
Ako imas klasu user i setujes username, password, birthday sa magicnim metodama i onda neko dodje da nastavi tvoj kod on nema pojima
sta sve ima ta user klasa. Kada gleda klasu on ne vidi sta sve ima klasa vec mora da prodje ceo kod. A ako kod ima par miliona linija onda je to divota.


Pa ne mora da prođe ceo kod nego samo deklaracije.
[ jablan @ 24.02.2014. 11:56 ] @
Kako da prođe samo deklaracije kad get i set metode mogu da prime bilo šta (videti primer koji je Ikac napisao)?

Drugo, teoretski neko može u getter metodi da napiše nešto kao

Code:

public function __get($name) {
  formatHardDisk();
}


i onda neko kaže echo $foo->name

Malo karikiram ali nije daleko od istine - imaš u kodu nešto što izgleda kao najobičnije čitanje atributa objekta a ustvari izvršava neki kôd sa ko zna kakvim side-efektima.
[ Ivan Stojmenovic Ikac @ 24.02.2014. 13:49 ] @
Ma sve je sada to do stila programiranja i potrebama! Eo zivi primer Symfony i Zend Fw, samo malo da se baci oko na njihov kod komponenti i bundles pa se onda dobije prava slika koliko su mocne te metode! Sto bi neko sada lupao glavu sta si ti pisao kada on jednostavno moze da napravi sebi novi objekat i uradi onako kako on zeli! Magija OOP.
[ VladaSu @ 24.02.2014. 15:29 ] @
Citat:
alfa-pro: Da to nevalja nebi ga ni izmislili. Ako nisi siguran sta je tamo neki Pera ili Mica pisao po celom App source-u u Front controlleru pogledaj koji su to!
Code:

$class_vars = get_class_vars(get_class($my_class));


ili dump-uj neku klasu pa da vidis


Druze, sa ovim nisi ama bas nista postigao. Sta ces da dobijes ako se koriste magic metode? Nista.

Napravili su i GOTO narebu pa se ispostavilo da nikako ne valja. To nije argument.
PHP je jedan od konceptualno najlosijih masovno prihvacenih programskih jezika sto se tice nacina programiranja i tu ce se svako sloziti. Sto bi neko pravio nesto lose?
U zadnjih 7-8 godina uspeli su znacajno da ga poprave ali jos uvek zaostaje. Pokusava se napraviti neki napredak sa Zend ali sve to kaska i ne daje rezultate kakve su ocekivali.
Zasto vecina drugih programskih jezika nema ove magic metode a u razvoju su 10 godina ispred PHP?
Svasta ljudi izmisle pa se kasnije vidi da to nije toliko korisno kao sto su mislili da ce biti.
Ja jesam PHP programer ali radio sam i Javu i ASP i .net i mogu da uporedim. Necu da pricam o mukama i smehu drugara koji su silom prilika prelazili sa nekog drugog jezika na PHP.
Ceo dan sam morao da slusam njihove neverice a odgovori su mi bili "jbg, jbg tako je, jbg..."

@Predraze kako ne mora da prodje ceo kood kada neko na nekom mestu podigne user klasu i setuje polje birthday. Ti samim pogledom na klasu ne mozes da znas da postoji to polje.
Mozda i mozes, zavisi od kooda. Nije mi jasno....

Citat:
Ivan Stojmenovic Ikac: Ma sve je sada to do stila programiranja i potrebama! Eo zivi primer Symfony i Zend Fw, samo malo da se baci oko na njihov kod komponenti i bundles pa se onda dobije prava slika koliko su mocne te metode! Sto bi neko sada lupao glavu sta si ti pisao kada on jednostavno moze da napravi sebi novi objekat i uradi onako kako on zeli! Magija OOP.


Uf. Sokiran sam :) A sto bi onda koristio neki FW kada neces da lupas glavu nego samo pravis nove objekte? Napravi sve iz pocetka. I bilo ko da nastavi tvoj kod i nece da lupa glavu neka sam pravi nove klase. Klasa na klasu, klasa na klasu a onda i najmanja izmena osnovne funkcije klase ima da bude nocna mora. Ili napravi Pera novu klasu, napravi Zika novu klasu i onda neko hoce da promeni nesto u user klasi i shvati da su Pera i Zika napravili nove klase za njihove potrebe jer ih je mrzelo da lupaju glavu i onda mora i tamo da menja. Eto ti prilike da zaposlis jos jednog programera ili da das otkaz Peri i Ziki. Ovo sto si ti rekao nije Magija OOP vec OOP nocna mora.

Nisam rekao da ne treba to koristiti vec treba paziti kada, kako i zbog cega se koristi jer precesto se desava da se koristi i kada nema potreba a samim tim se komplikuje kood.
Konkretno u ovom primeru ne vidim zasto bi se koristilo. Potencijalno vece stete nego koristi.

Uopste me ne zanima ko je u pravu vec sam samo hteo da skrenem paznju autoru teme da moze taj savet sa magic pristupom da pored dobrih posledica moze da ima i negativne posledice i da treba razmotri pre nego sto pocne da pise takav kood a na njemu je da odluci.
[ VladaSu @ 24.02.2014. 15:56 ] @
Da ne bih pricao dalje vredi procitati

Ja sam davno izbacio magic metode a razlozi su navedeni na linku. Dosao sam u situaciju kada sam video da to ne valja. Verovatno je bilo jos razloga zbog
kojih me je zabolela glava ali davno bese to da se vise ni ne secam ...