[ Lacke @ 13.10.2013. 08:49 ] @
Code:


class Test {

        public $variable;

        public function test() {

            echo $this->variable;
        }
    }

    $instance = new Test();
    $instance->variable = 'string';
    
    echo $instance->variable;




Da li se zapravo, u ovom delu:
Code:
$instance->variable = 'string';
vrsi pozivanje __set metode?
a u delu:
Code:
echo $instance->variable;
vrsi se pozivanje __get metode?
[ deZio @ 13.10.2013. 09:43 ] @
Ne, iz razloga jer si definisao $variable kao public.

__set i __get se ne pozivaju u slučajevima kada je atribut klase dostupan, tj "može mu se prići".

U ovom tvom primeru pošto si $variable postavio kao public, taj atribut je uvek dostupan, tako da se __set i __get neće pozivati. Ako u tvom primeru atribut $variable obrišeš ili mu promeniš public na npr. private, static ili protected onda će se pozivati __set i __get.

Dakle __set i __get ti služe kao neki vid hvatanja greške, tj. pozivaju se samo ako nemaš dozvolu da pristupiš/setuješ neki atribut klase.

Takođe treba da imaš u vidu da se __set i __get pozivaju samo kada definišeš objekat klase, dakle neće se izvršavati ako pristupaš klasi statično.

Dakle tvoj kod je ispravan, ali pošto je $variable public, __set i __get neće biti pozvani.
[ Lacke @ 13.10.2013. 09:47 ] @
Au, da da. Hvala mnogo na odgovoru, nisam ni video da sam stavio public ali mi je sada sve kristalno jasno.
Hvala mnogo na odgovoru :)
[ Lacke @ 13.10.2013. 12:19 ] @
Code:
class Test {

        private $variable;

        public function test() {

            echo $this->variable;
        }
    }

    $instance = new Test();
    $instance->test();


Sad se na osnovu ovog koda pozvala metoda __set() ?
[ deZio @ 13.10.2013. 15:05 ] @
Ne __set je ne setuješ ništa već samo uzimaš vrednost atributa. Dakle može samo __get

Ali se u ovom tvom primeru neće ni __get pozvati, jer kao prvo, moraš __get metodu definisati. A kao drugo, $variable nije nedostupan metodi test().

Da koristiš $instance->variable, pozvao bi se __get jer pristupaš van klase atributu koji je private. A taj atribut nije private i metodama klase, zato neće biti __get-a
[ Lacke @ 13.10.2013. 15:26 ] @
Hvala na odgovoru, jos uvek ucim i slazem sve kockice kako i zasto.

Mozes li samo da pogledas sledeci kod i da mi kazes da li je sve ispravno, da li se na ispravan nacin pristupa property-ma i metodama:

Code:

class Test {

        public $variablee = 1; // po defaultu
        private $variable = 3; // po defaultu
        protected $variableee = 5; // po defaultu
        static $variableeee = 7; // po defaultu

        public function test0($newvalue) {

            return $this->variable = $newvalue; // $this --> samo unutar klase
        }

        public function test1($newvalue) {

            return $this->variableee = $newvalue; // $this --> samo unutar klase
        }

        public function test2($newvalue) {

            return self::$variableeee = $newvalue;
        }

        public function to_access_bar_function(Test $other) {

            $other->bar();
        }

        private function bar() {

            echo 'Accessed the private method. Great!';
        }

    }

    echo Test::test2(13) .'<br>'; // za static ne mora da se instancira

    $obj = new Test();
    //var_dump($obj);

    // za public
    $obj->variablee = 9; // --> __set metoda
    echo $obj->variablee .'<br>'; // --> __get metoda

    // za private
    echo $obj->test0(10) .'<br>';

    // za protected
    echo $obj->test1(14) .'<br>';

    //  metoda za static
    echo $obj->test2(15) .'<br>';    // za static ne mora da se instancira i moze

    echo $obj->to_access_bar_function(new Test ('access'));
[ Tpojka @ 13.10.2013. 15:41 ] @
I samog me zanima tema, ali evo malo bolje obilježavanje varijabli:

Code (php):

class Test {

        public $variable_pub = 1; // po defaultu
        private $variable_priv = 3; // po defaultu
        protected $variable_prot = 5; // po defaultu
        static $variable_stat = 7; // po defaultu

        public function test0($newvalue) {

            return $this->variable_priv = $newvalue; // $this --> samo unutar klase
        }

        public function test1($newvalue) {

            return $this->variable_prot = $newvalue; // $this --> samo unutar klase
        }

        public function test2($newvalue) {

            return self::$variable_stat = $newvalue;
        }

        public function to_access_bar_function(Test $other) {

            $other->bar();
        }

        private function bar() {

            echo 'Accessed the private method. Great!';
        }

    }

    echo Test::test2(13) .'<br>'; // za static ne mora da se instancira

    $obj = new Test();
    //var_dump($obj);

    // za public
    $obj->variable_pub = 9; // --> __set metoda
    echo $obj->variable_pub .'<br>'; // --> __get metoda

    // za private
    echo $obj->test0(10) .'<br>';

    // za protected
    echo $obj->test1(14) .'<br>';

    //  metoda za static
    echo $obj->test2(15) .'<br>';    // za static ne mora da se instancira i moze

    echo $obj->to_access_bar_function(new Test ('access'));
 
[ Tpojka @ 25.10.2013. 13:34 ] @
U kodu:
Code (php):

public $variablee = 1; // po defaultu
private $variable = 3; // po defaultu
protected $variableee = 5; // po defaultu
static $variableeee = 7; // po defaultu
 

malo ko može da se snađe i čisto sumnjam da bi i tačan odgovor mogao puno da pomogne onom ko očekuje isti.

Nisam naučio trovati teme, ali od nekog stava poput Vašeg bi bar očekiv'o odgovor u roku od odma' na postavljeno pitranje.
Ne znam kako kod Vas, ali ja sam naučio da ako trebam pomoć dati/primiti bilateralnoj strani apsolutno ne treba otežavati slučaj.

Samo napominjem postavljača pitanja kako treba da se odnosi prema (sopstvenom) problemu, a pogotovo prema nekome od koga očekuje pomoć.
Ukoliko moderacija smatra da treba brisati napisano, nemam problema sa tim.

Edit: moderacija je bila brža.
[ VladaSu @ 29.10.2013. 07:37 ] @
Au Tpojka. Prosto nisam mogao da izdrzim da ne prokomentarisem pisanje varijabli gde joj u imenu navodis access. Prvi put to u zivotu vidim.
Ranije dok editori nisu bili ovoliko mocni private je pocinjao sa _ tj. $_is_something a public je bio $is_something.
Prva verzija php-a sa klasama php 3 nije podrzavala private, public i protected keyworde pa su se ljudi snalazili na ovaj nacin sa _.
To neko "pravilo" je kratko trajalo jer se vec sa narednom verzijom uvidela besmislica toga.

Sta ako jednog dana public postane private? Onda menjas ime svuda u klasi ili sta? Ili jos gore public postane protected i onda svuda i van klase to manjes?
Zar mislis da ako u imenu stavis da je priv da ce kod van ove klase videti variablu? Kod van klase videce samo public. Zasto je onda to bitno za kod van klase?
Zar je bitno u klasi da li je neka variabla public ili private? Pa unutar klase tebi je svejedno da li je private ili public. Isto radis sa njima.

Svi normalniji php editori imaju autocomplite koji daje dovoljno informacija bez da tako opisujes varijablu.
Code (php):

/**
@access private
@var bool [=false]
*/

private $is_something = false;
 

Eto ako bas hoces da ti lepo pise access ali mislim da nema potrebe. Ako ne koristis access kako treba kod ti jednostavno nece raditi bez obzira kako je nazoves.
Prosto ne vidim ni jedan argument da se to tako radi.

Druga stvar za Lacketa.
Treba izbegavati __get i __set jer se takav kod tesko testira, nikada ne znas sta mozes da ocekujes i nemas potpunu kontrolu nad tokom.
Ako neki drugi uzme da radi na kodu mora da zna koje sve varijable mozes da setujes ili pozoves. Nemoj ocekivati da bilo ko drugi sem tebe to skonta bez da pola dana
bulji u kod.
__set i __get dosta usporava kod.
Nemas autocomplite.
Recimo da setujes polje koje se zove u bazi name i posle promenis u bazi sa username.
Problemi!


Ne kazem da ne koristis, stvar izbora, ali mislim da komplikujes sebi zivot :)
Verovatno postoje slucajevi kada je ovo korisno ali nisam naisao do sada na kod gde ovaj kod ima vise koristi nego stete.
[ Tpojka @ 29.10.2013. 10:12 ] @
Citat:
VladaSu:

Au Tpojka.
.
.
.
Code (php):

/**
@access private
@var bool [=false]
*/

private $is_something = false;
 

.
.
.
Prosto ne vidim ni jedan argument da se to tako radi.


Korektna primjedba.

Uopšte mi nije bio cilj da se na to obraća pažnja.
Mada uviđam da nije baš dobro za onog ko očekuje znanje, da uči sa nepotrebnim prefiksima ili sufiksima.
Cilj mi je bio čisto lakše razumijevanje run time-a.

Ako je dokaz, sam nazivam varijable opisnom formom do 3 riječi dužine sa ili bez skraćenica samih riječi u zavisnosti od pretpostavke broja poziva u izvođenju koda.
Code (php):
$menu_link_active

Svjestan sam nedostatka camelCase, ali i to će se promijeniti u ponedeljak kad krenem na dijetu i prestanem da pušim (šalim se, nema potrebe za dijetom, a već sam prest'o da duvanim). :)

Hvala na komentaru, u svakom slučaju.