Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Referencje w klasach
Forum PHP.pl > Forum > PHP
Duiaheru
Witajcie, od czasu do czasu przeglądam forum i często spotykam się z referencją w klasach, czego totalnie nie rozumiem.
Referencja, jest to powiązanie jakieś między zmiennymi, więc jeśli w jednej zmiennej zmieni się coś, to w drugiej następuje taka sama zmiana. Dobrze to rozumiem?

Chciałem zaczaić, jak działa framework jakikolwiek, ale wszędzie spotykam się z referencją.
Jednym z takich frameworkuf jest np. Mojavi.
Przykładem referencji jest np. ten z postu: http://forum.php.pl/viewtopic.php?p=101720#101720

Możecie mi wytłumaczyć na czym to wszystko polega, jak ma się referencja na zwyczajnych zmiennych do tych na klasach i właściwie to po co to wszystko ?

Zanim odpowiecie na pytanie, możecie się zacząć denerwować, pytając: dlaczego do cholery nie poszukasz o tym na forum czy w artykułach?
Odpowiedź: szukałem, i szukam od jakiegoś tygodnia i jak narazie żadnych rezulatów. Angielskiego nie znam za dobrze, a w polskich manualach nie znalazłem tego.

Liczę, że potraficie mnie zrozumieć, a przede wszystkim na to, że mi to wytłumaczycie. Jestem przekonany, że nie jeden sobie zadaje to samo pytanie, więc już przynajmniej będziecie mogli go odsyłać do tego tematu.
lukaswoj
Krótko.

W momencie gdy wykonasz taki kod:
[php:1:0ef355d348]
<?php
$zmienna_a='ania';

$zmienna_b=$zmienna_a;

$zmienna_b='dorotka';

echo "zmienna a: $zmienna_a <br>";
echo "zmienna b: $zmienna_b <br>";
?>
[/php:1:0ef355d348]

Otrzymasz taki wynik:
Kod
zmienna a: ania

zmienna b: dorotka


Teraz drugi, bardzo podobny przykład:
[php:1:0ef355d348]
<?php
$zmienna_a='ania';

$zmienna_b=&$zmienna_a;

$zmienna_b='dorotka';

echo "zmienna a: $zmienna_a <br>";
echo "zmienna b: $zmienna_b <br>";
?>
[/php:1:0ef355d348]
I wynik:
Kod
zmienna a: dorotka

zmienna b: dorotka


W momencie gdy użyjesz operatora przypisania "=" to wartość zmiennej znajdującej się po prawej stronie (w naszym przypadku to $zmienna_a i jej wartosc 'ania') jest przypisywana do nowej zmiennej o nazwie użytej po lewej stronie (w tym przypadku $zmienna_b).

Czyli po takiej operacji mamy dwie fizyczne kopie tej samej wartości pod postacią dwóch różnych zmiennych ($zmienna_a i $zmienna_b).

Jeśli teraz zmienisz wartość którejkolwiek ze zmiennych, nie będzie to miało wpływu na wartośc tej drugiej.

Natomiast w przypadku referencji "&=" zmienna użyta z lewej strony operatora przypisania staje się tak jakby "drogowskazem", wskazującym na wartośc zmiennej użytej z prawej strony.

Po takiej operacji $zmienna_a pozostaje niezmieniona a $zmienna_b jest "referencją do zmiennej_a".

Teraz jeśli spróbujesz zmienić wartośc $zmienna_b to tak naprawdę zmienisz wartość $zmienna_a.

Spójrz na powyższe przykłady, "przetraw" to co napisałem i zrozum... smile.gif
Duiaheru
Cytat
Natomiast w przypadku referencji "&=" zmienna...

A nie "=&' ? ;-)

No dobra, powiedziałem, że mniej więcej rozumiem jak wyglądają referencje na zwykłych zmiennych. Starałem się też to przetrawić, zrozumieć :].. jednak.. dalej nie wiem jak to ma się do klas

W przypadku kodu np.:
[php:1:b059702b2b]
<?php

class ExecutionFilter extends Filter
{
function & ExecutionFilter ()
{
parent::Filter();
}
function execute (&$filterChain, &$controller, &$request, &$user)
{
$execChain =& $controller->getExecutionChain();
$action =& $execChain->getAction($execChain->getSize() - 1);

/* jakis tam kod dalej, niewazne, chodzi mi o przyklad */


?>[/php:1:b059702b2b]

To w tym omencie co oznacza ampersand przed nazwą funkcji, czy też przed zmiennymi w deklaracji funkcji 'execute' ? albo np. tutaj:
[php:1:b059702b2b]<?php
$controller =& Controller::getInstance();
?>[/php:1:b059702b2b]
czy też [php:1:b059702b2b]<?php
$authHandler =& new PrivilegeAuthorizationHandler;
$user =& new PrivilegeUser;
?>[/php:1:b059702b2b] tu ?
tzn. że dajmuy na to $user jest powiązana z obiektem PrivilegeUser, ale jak to można w praktyce wykorzystać ?

Po cholerę w ogóle to jest ? [najważniejsze pytanie odnośnie tej całej referencji - dot. klas przede wszystkim]

Czy ktoś może mi wytłumaczyć, do czego użyć w ogóle referencji ? Jak dla mnie to to jest w ogóle nie potrzebne, a jednak używane dość często.

Tego nie rozumiem..
patrycjusz
Hej,
spróbuje jak na chłopski rozum,
patrz klasa to...
czolg sterowany zdalnie przez jasia ,
czolg ma paliwo (wlasciwosci klasy) i jakies mozliwosci (jezdzi,skreca i takie tam czyli metody)
i teraz jasio ma dostep do czolgu (stworzony jest obiekt czolgu dla jasia) i steruje nim pilotem czy czyms,
a teraz przychodzi malgosia i ona tez chce miec dostep do czolgu jasia no to wtedy uzywa sie referencji czyli
[php:1:d18d427449]<?php
$dostepDoCzolguDlaMalgosi = & new czolg();
?>[/php:1:d18d427449]
a jezeli malgosia bedzie chciala miec swoj wlasny czolg to nie skorzysta z referencji i zostanie stworzony osobny nowy czolg tongue.gif
no mam nadzieje ze w miare rozsadnie to opisalem smile.gif
Pozdro
Duiaheru
Heh.. fajny przykład..

ale już druga odpowiedź znowu niepełna..

już prawie rozumiem o co chodzi z tymi referencjami, acz jeszcze pozostało kilka rzeczy..

np. co to jest, jeżeli postawimy '&' tak jak poniżej:
[php:1:65ac4a9f7c]<?php
class ExecutionFilter extends Filter
{
function & ExecutionFilter ()
{
parent::Filter();
}
function execute (&$filterChain, &$controller, &$request, &$user)
{
$execChain =& $controller->getExecutionChain();
$action =& $execChain->getAction($execChain->getSize() - 1);

?>[/php:1:65ac4a9f7c]

bo tego dalej nie rozumiem... po co dajmy znak '&' przed nazwą funkcji ?

to co się dzieje w funkcji execute z tymi zmiennymi to sobie wykonałem test i sprawdziłem, że zmieniając np. $filterChain zmienia się zmienna, która podstawiliśmy w to miejsce odpalając funkcję.
Tylko wytłumacz mi jeszcze właśnie z tą funkcją ExecutionFilter, dlaczego tam jest znak '&', plz.
patrycjusz
no to prosze smile.gif
jezeli dasz & przed nazwa funkcji zwróci ona referencje np
[php:1:ac9ccf9705]<?php
function & test ()
{
//to tylko przyklad
return new klasa();
}
?>[/php:1:ac9ccf9705]
a po co go dajemy ?
bo tak to juz jest w programowaniu obiektowym i tutaj odsylam do googla i poczytania sobie na temat OOP a w wielkim skrócie moge powiedziec tylko tyle ze sa & po to aby odwolywac sie do jednego i tego samego miejsca w pamieci smile.gif
Pozdro
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.