Korzystając z tej strony zgadzasz się z polityką prywatności i regulaminem.
Akceptuj
WebInside.plWebInside.plWebInside.pl
  • Aktualności
  • Technologie
  • WWW
  • E-marketing
  • AI
  • Poradniki
  • e(Biznes)
Szukaj
  • Kontakt
  • Forum
WebInside.pl © 2023.
Czytasz: Przekazywanie przez wartosć, zmienną
Udostępnij
Zaloguj się
Powiadomienia
Aa
WebInside.plWebInside.pl
Aa
Szukaj
  • Strona główna
  • Aktualności
  • Technologie webowe
  • Publicystyka
  • E-marketing
  • Poradniki
  • AI
  • Technologie
  • Artykuły partnerskie
  • Więcej
    • Kontakt
    • Mapa strony
Masz już konto? Zaloguj się
  • Aktualności
  • Technologie
  • WWW
  • E-marketing
  • AI
  • Poradniki
  • e(Biznes)
WebInside.pl © 2023.
WebInside.pl > Technologie webowe > Przekazywanie przez wartosć, zmienną
Technologie webowe

Przekazywanie przez wartosć, zmienną

WebInside.pl
Ostatnia aktualizacja: 24.07.2003
WebInside.pl
Udostępnij
Udostępnij

Czym różni się przekazywanie parametru przez wartość a przez zmienną? Wielu początkujących programistów nie wie, jak to dobrze wykorzystać. Jeśli masz podobny problem, przeczytaj ten artykuł.

Zawartość
Krótkie przypomnienie:Kiedy użyć przekazania przez wartość a kiedy przez zmienną:

Wielu początkujących programistów nie widzi różnicy pomiędzy przekazywaniem parametru przez wartość a przekazywaniem parametru przez zmienną zwanym referencją. Otóż różnica jest, dzięki tym dwóm metodom można znacznie efektywniej pracować z funkcjami i nie tylko.

Krótkie przypomnienie:

Przekazanie przez wartość powoduje kopiowanie przekazywanej wartości do innej zmiennej, przez co powstają dwie kopie tej samej wartości. Natomiast przekazanie przez zmienną (czyli wstawiając przed deklaracją zmiennej znak „&” np. &$jakas_zmienna) powoduje utworzenie zmiennej z odwołaniem do przekazywanej wartości (wskaźnik do miejsca w pamięci). Gdy przekazujemy przez wartość, zmiana wartości jednej z kopii nie powoduje zmiany w drugiej, natomiast, gdy przekażemy przez zmienną zmiana w jednej powoduje zmianę w drugiej. Nic bardziej błędnego niż uważać, że nie ma to różnicy. Zrozumienie tej właśnie różnicy może zaoszczędzić bałaganu w kodzie programu.

Jak to wygląda w praktyce.
Dla przykładu tworzymy funkcję i dwie zmienne z ustawiając im inne wartości:

$zmiennaA = 5;
$zmiennaB = 10;

function funkcja( $zmienna )
{
$zmienna = 30;
}

Następnie wywołujemy tą funkcję dla dwóch zmiennych.

funkcja( $zmiennaA );
funkcja( &$zmiennaB );

Teraz możemy wyświetl wartość obu zmiennych:

echo $zmiennaA;

Da w wyniku:

5

Druga zmienna:

echo $zmiennaB;

Da w wyniku:

30

Dlaczego tak się dzieje? Zmienna $zmiennaA została przekazana przez wartość i została utworzona kopia tej zmiennej w ciele funkcji, w której zmiany nie dotyczą zmiennej przekazanej jako parametr. Zmienna $zmiennaB natomiast zmieniła swoją wartość, dlatego bo zamiast tworzyć kopię tej wartości zostało utworzone odwołanie do miejsca w pamięci przechowującego tą zmienną.

Ktoś może powiedzieć, że można to zrobić inaczej np.:

$zmiennaA = funkcja( $zmiennaA );

W porządku da się tak, ale to jest głupie pytanie, równie dobrze można zapytać, po co jest inkrementacja, bo przecież, po co robić tak:

$zmienna++;

skoro można zrobić tak:

$zmienna += 1;

albo nawet:

$zmienna = $zmienna + 1;

jak ktoś uważa, że takie działanie jest uzasadnione to proszę bardzo.

Kiedy użyć przekazania przez wartość a kiedy przez zmienną:

Odpowiedź jest prosta, przekazujemy przez zmienną, kiedy chcemy zmodyfikować daną zmienną w jakiś sposób, a przez wartość wtedy, gdy potrzebujemy oddzielnej zmodyfikowanej wartości danej zmiennej.

W praktyce prezentuje to się tak.
Wezmę przykład wszystkim znany, mam tablicę z imionami:

$imiona = array( „Tomek”, „Romek”, „Atomek”, „Tomek”, „Bolek”, „Lolek” );

teraz chcę ją posortować, więc używam funkcji sort(), ale w ten sposób:

sort( $imiona );

jasne jest chyba, dlaczego w tej formie, bo po co mi oddzielna kopia tablicy z posortowanymi i nie posortowanymi imionami. Mam w wyniku posortowaną tablice z imionami. Ale teraz chcę, wypisać jakie imiona mam w tablicy, tzn. bez powtarzających się, wykorzystam do tego funkcję array_unique():

$spis_imion = array_unique( $imiona );

tym razem potrzebuję oddzielnej tablicy, gdyż wykonanie zmian na głównej tablicy spowodowałoby nieodwracalne zmiany i utratę części danych, a tak mam dwie tablice, które będą potrzebne w różnych momentach.

!!!Uwaga ktoś by zapytał, dlaczego napisałem sort($imiona) a nie sort(&$imiona), owszem można napisać tak i tak tylko, że nie robi to różnicy gdyż funkcja sort() nie zwraca wyniku i zmiany zapisuje automatycznie do parametru. Jest to działanie intuicyjne, bo z założenia, po co komu ta sama tablica posortowana i nie posortowana??? Jeśli ktoś już takiej potrzebuje to może napisać tak:

$imiona_NP = $imiona;
sort($imiona);

wówczas zachowa nie posortowaną wersję. Natomiast funkcja array_unique() dokonuje znaczących zmian w parametrze i nierozsądnym byłoby gdyby zapisywała zmiany bezpośrednio do parametru, ale oczywiście jest to możliwe poprzez przekazanie przez zmienną:

array_unique(&$imiona);

To tyle, jeżeli chodzi o przekazywanie wartości przez wartość i przez zmienną.

Przekazywanie przez zmienną jest również możliwe w klasach i obiektach, mamy na przykład klasę Mors z dwiema metodami: zaszyfruj i odszyfruj, definicja wygląda następująco:

class Mors
{

function zaszyfroj( $ciag )
{
//zbiór instrukcji zaszyfrowujących podany ciąg i zapisujących go w zmiennej $zaszyfrowany
return $zaszyfrowany;
}
}

teraz trzeba stworzyć egzemplarz klasy Mors:

$alfabet_morsa = new Mors;

a następnie wykorzystać jego metodę:

$zaszyfrowany_ciąg = $alfabet_morsa->zaszyfruj( $ciag_do_zaszyfrowania );

to jest jeden ze sposobów wykorzystujący przekazanie przez wartość, natomiast przekazanie przez zmienną wyglądałoby następująco:

Zmiany w Klasie:

class Mors
{

function zaszyfruj( $ciag )
{
//
//zbiór instrukcji zaszyfrowujących podany ciąg i zapisujących go w zmiennej $zaszyfrowany
//
//trzeba na koniec wynik przepisać do parametru, ponieważ to on przechowuje odwołanie do wartości
$ciag = $zaszyfrowany;
}
}

teraz trzeba stworzyć egzemplarz klasy Mors:

$alfabet_morsa = new Mors;

a następnie wykorzystać jego metodę, która może wyglądać tak:

$alfabet_morsa->zaszyfruj( &$ciag );

funkcja wykona się na wartości przekazanego parametru.

Jest jeszcze jedna ważna rzecz, jeśli chodzi o przekazywanie przez zmienna w klasach, a mianowicie, jeżeli zmienna ma być przechowywana w klasie deklaracja przekazania przez zmienną musi być również w definicji klasy, np.:

class Magazyn
{
var $cenaWMagazynie;

function zapiszcene( $cena )
{
$this->cenaWMagazynie = &$cena; //przekazanie przez zmienną
}
}

Teraz tworzymy egzemplarz klasy magazyn:

$mojMagazyn = new Magazyn;

przekazuję cenę do obiektu $mojMagazyn:

$cenaZaMagazynem = „50 zł”;
$mojMagazyn->zapiszcene( $cenaZaMagazynem );

w ten sposób mamy zmienną i właściwość ustawiona na wartość „50 zł”. Wartość została przekazana przez zmienną, zmiana wartości którejkolwiek ze zmiennych powoduje automatyczną zmianę w drugiej.

!!!Uwaga, należy pamiętać, aby przekazanie przez zmienną „&” zastosować przy przekazywaniu wartości do obiektu i w obiekcie, tak jak to pokazano na przykładzie.

Może Cię zainteresować

Sprawdź, jak zostać testerem oprogramowania lub Java developerem! Poznaj kursy online!

Architektura globalnego e-commerce: Jak zbudować sklep gotowy na podbój świata?

Java obchodzi 30. urodziny – język programowania który zmienił świat technologii

Jak zacząć projektować aplikację, nie mając gotowego pomysłu?

Serwer dla małej firmy – czym kierować się przy jego wyborze?

WebInside.pl 2003-07-24 2003-07-24
Udostępnij ten artykuł
Facebook Twitter Kopiuj link Wydrukuj
Udostępnij
Poprzedni artykuł Zabezpieczenia formularzy
Następny artykuł Smarty
Zostaw komentarz lub opinię

Dodaj komentarz Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Najnowsze artykuły

Procesor AMD Ryzen 7
Najlepsze procesory z pamięcią 3D V-Cache: Wydajność dla graczy i profesjonalistów
Technologie
Jak przygotować sklep internetowy na automatyzację obsługi klienta?
Artykuły partnerskie
the nvidia logo is displayed on a table
Nvidia przyłapana? Gigant AI chciał kupić miliony pirackich książek
AI Aktualności
Najczęstsze błędy w SMS marketingu: jak nie przepalić budżetu?
E-marketing
4 najczęstsze cyberzagrożenia w przemyśle
Technologie
Jak uratować zaschnięty tusz do drukarki? Skuteczne domowe sposoby i porady
Poradniki
Model 3D jako wspólne źródło danych dla projektu, produkcji i montażu
Artykuły partnerskie
Dlaczego wideo z telefonu sprzedaje na TikToku lepiej niż profesjonalne spoty?
Artykuły partnerskie
Dwa ekrany zawsze pod ręką – zalety korzystania z monitora przenośnego na co dzień
Technologie
Rola nowoczesnych technologii w procesie rehabilitacji
Artykuły partnerskie
banner
Chcesz umieścić swoją reklamę w portalu WebInside.pl?
Skontaktuj się z nami, a zaproponujemy interesujące formy reklamy.
Skontaktuj się

Inne polecane artykuły

Technologie webowe

Sprawdź, jak zostać testerem oprogramowania lub Java developerem! Poznaj kursy online!

5 min czytania
Technologie webowe

Architektura globalnego e-commerce: Jak zbudować sklep gotowy na podbój świata?

7 min czytania
MacBook Pro showing programming language
Technologie webowe

Java obchodzi 30. urodziny – język programowania który zmienił świat technologii

9 min czytania
AktualnościTechnologie webowe

Jak zacząć projektować aplikację, nie mając gotowego pomysłu?

9 min czytania
woman in black top using Surface laptop
Technologie webowe

Serwer dla małej firmy – czym kierować się przy jego wyborze?

5 min czytania
Technologie webowe

Jaki hosting wybrać pod Laravel? Kompleksowy przewodnik dla twórców aplikacji webowych

6 min czytania
programming language
Technologie webowe

Kaskadowość w CSS – wszystko, co musisz wiedzieć

7 min czytania
two women talking while looking at laptop computer
Technologie webowe

Darmowe kreatory stron WWW – stwórz swoją stronę w godzinę

14 min czytania
//

WebInside.pl – portal technologiczny. Aktualności ze świata technologii, webmastering, marketing internetowy, AI, poradniki.

 

Partnerzy

Wszystkie kategorie

  • AI
  • Aktualności
  • Artykuły partnerskie
  • E-marketing
  • e(Biznes)
  • Poradniki
  • Publicystyka
  • Technologie
  • Technologie webowe

Ostatnio dodane

  • Najlepsze procesory z pamięcią 3D V-Cache: Wydajność dla graczy i profesjonalistów
  • Jak przygotować sklep internetowy na automatyzację obsługi klienta?
  • Nvidia przyłapana? Gigant AI chciał kupić miliony pirackich książek
  • Najczęstsze błędy w SMS marketingu: jak nie przepalić budżetu?

Kontakt

Chcesz się z nami skontaktować? Jesteś zainteresowany reklamą lub artykułem sponsorowanym?

Skorzystaj z formularza kontaktowego lub napisz do nas na kontakt@webinside.pl

WebInside.plWebInside.pl
WebInside.pl © 2023 | Mapa strony | Forum | Polityka prywatności
Witaj ponownie!

Zaloguj się do swojego konta

Zapomniałeś hasła?