Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: przekazanie zmiennej
Forum PHP.pl > Forum > Przedszkole
Maciek1705
Witam mam pewien problem na początek dodam że to pierwszy mój skrypt w oop więc pewnie głupie pytanie zadam. Przedstawię kod:
  1. class sample{
  2. // tutaj znajduje się środek klasy deklaracja zmiennych oraz funkcja
  3. }
  4.  
  5. $sample = new sample();
  6. $ZMIENNA = $sample->long();
  7.  
  8. class to_next{
  9. private $current_position = ?;
  10.  
  11. dalszy ciąg kodu
  12. }


jak zrobić żeby przekazać wartość $ZMIENNA od razu do $current_position żeby wyglądało to tak:
private $current_position = $ZMIENNA;

tylko że tak się nie da, próbowałem różnych opcji ale nie wiem czy podczas deklaracji rodzaju zmiennej można nadać jej wartość innej zmiennej?
!*!
Wywołujesz klasę to_next z jakimś parametrem np.

  1. to_next($ZMIENNA);


Poczym w __construct($zmienna) przypisujesz

  1. $this-> current_position = $zmienna;


Ewentualnie:

W __construct klasy to_next, robisz

  1. $sample = new sample();
  2. $this-> current_position = $sample->long();
Szymciosek
Nie wiem czy dobrze rozumiem

  1. class Sample
  2. {
  3. public $current_position;
  4. public function __construct($current_position)
  5. {
  6. $this->current_position = $current_position;
  7. }
  8. }
  9.  
  10. $obj = new Sample(5);
Maciek1705
nie nie ok tak wiem że można ale nie do końca o to chodzi spójrzmy na to tak

  1.  
  2. class pierwsza{
  3.  
  4. }
  5.  
  6.  
  7. $pierwsza = new pierwsza();
  8. $X = $pierwsza->long();
  9.  
  10. class druga{
  11. deklaracja zmiennych
  12.  
  13. public $moja-zmienna = 1;
  14.  
  15. teraz pytanie jak zamiast tej jedynki dokładnie w tym miejscu bez kończenia klasy itp wstawić inną zmienną która jest powyżej klasy np $X
  16.  
  17. chodzi mi o przekazanie zmiennych między klasami ten $X jest wynikiem działania jednej z klas jest umiejscowiony przed klasą a nie wewnątrz chce po prostu przypisać public $moja-zmienna = $X; tylko taki zapis jest błędny
  18. .....
  19.  
  20. }
  21.  
  22.  
  23.  
  24.  
nospor
Nie da się i już.

Napisz lepiej co chcesz przez to osiągnąć to ci napiszemy jak to zrobić a nie sam bez sensu kombinujesz.
Szymciosek
No właśnie autor tak trochę bez sensu kombinuje, nie chciałem tego pisać, ale już ok.
Są inne sposoby na takie działania tylko nie wiemy o co chodzi.
nospor
Cytat
nie chciałem tego pisać, ale już ok.
No ale skoro się znalazł taki jeden wredny co to napisał to już ok.... wink.gif
!*!
Nie możesz ponieważ klasy są hermetyczne i wszytko co jest w nich, działa tylko w ich obrębie, a dane z zewnątrz o ile nie są do nich przekazywane, zwyczajnie nie zadziałają. Musisz przekazywać informacje do klasy, a na tym polega oop (szczególnie że 1 plik = 1 klasa).
Maciek1705
już Wam mówię o co chodzi.
jest plik do zmiany wersji językowej, działa super nie mam zastrzeżeń, posiada jedną klasę a w niej na początku są 4 zmienne z czego jedna mnie interesuje jest to private current_language = FALSE; czyli bieżący język jest ustawiony na 0. Przed tą klasą w tym samym pliku dopisałem inną klasę geolokalizacji która sprawdza gdzie się znajdujesz i jaki włączyć Ci bieżący język strony. Ta klasa działa też bez zarzutu w $X mam kod danego kraju który chciałem przekazać do tej drugiej klasy do zmiennej private current_language która domyślnie jest pusta. W jednym z tematów na tym forum było poruszone zagadnienie przekazania zmiennej pomiędzy klasami lecz u mnie to nie działało. Może inaczej jak taki kod:
  1. class sample{
  2. public $cur_lang = FALSE;
  3.  
  4. public function geo_lang(){
  5. switch($_SESSION['code']):
  6. case "PL":
  7. $this->cur_lang = 'pl';
  8. break;
  9. default:
  10. $this->cur_lang = 'en';
  11. endswitch;
  12.  
  13. return $this->cur_lang;
  14. }
  15. }


zmieścić w tej zmiennej:
  1. private $current_language = ;

tak żeby ta zmienna była równa wynikowi działania klasy powyżej
peter13135
Nie chce mi się specjalnie czytać tego tematu, więc dam swojego exampla, mam nadzieję, że trafiłem w sedno tematu.

  1.  
  2. class klasa1
  3. {
  4. private $zmienna ;
  5. public function __construct()
  6. {
  7. róbCoś()
  8. }
  9.  
  10. private function róbCoś()
  11. {
  12. $this->zmienna = 1;
  13. }
  14.  
  15. public function getZmienna()
  16. {
  17. return $this->zmienna;
  18. }
  19.  
  20. }
  21.  
  22. class klasa2 {
  23.  
  24. private $zmienna;
  25.  
  26. public function __construct()
  27. {
  28. $this->zmienna = 0;
  29. }
  30.  
  31. public function setZmienna($v)
  32. {
  33. $this->zmienna = $v;
  34. }
  35.  
  36. }
  37.  
  38.  
  39. $ob1 = new klasa1;//konstruktur wywołuje metodę, która ustawia wartość "zmienna" na 1
  40. $ob2 = new klasa2;// "zmienna" ma wartość 0
  41. $ob2->setZmienna($ob1->getZmienna());
  42.  
Maciek1705
przerobiłem już tak skrypt że zmienną mam w sesji teraz kwestia ustawienia jej to znaczy jak zrobić w oop coś takiego
  1. private $curent_lang = $_SESSION['lang'];


taki zapis jest błędny chodź nie do końca wiem dlaczego, więc jak teraz zrobić żeby zmiennej $curent_lang przypisać wartość zmiennej sesyjnej $_SESSION['lang']questionmark.gif?
peter13135
No stary, to podstawy. Dałem Ci przykład przecież.

Robisz sobie metodę do ustawiania zmiennej :

  1.  
  2. public function setCurrentLang($v)
  3. {
  4. $this->current_lang = $v;
  5. }
  6.  



i na swoim obiekcie robisz operacje :
  1. $obiekt->setCurrentLang($_SESSION['costam']);//ovzywiście zamiast sesji może byc dowolna zmienna liub stała.
Maciek1705
nie no wszystko ok za przykład dziękuje ale ale wszystko ok do czasu przykład się sprawdza ale problem polega na tym jak to zrobić wewnątrz klasy pierwszy przykład był jak ustawić na zewnątrz klasy, zrobinie metody nie jest problemem dla mnie, nie potrafię tej metody wywołać wewnątrz klasy ot cały problem
!*!
Czytałeś co napisałem? Klasy są hermetyczne. Więc jak chcesz przesłać coś z zewnątrz, bez wywołania metody? Nie ma sposobu i nie kombinuj, tylko zrób to jak należy.
thek
A to nie może użyć konstruktora sparametryzowanego? wink.gif Ludzie... Czy zawsze musi być
new Klasa
a nie może być new Klasa(parametr) questionmark.gif
Poczytajcie manual choćby do dowolnego języka OOP, bo PHP tak też działa
  1. public function __construct($param)
  2. {
  3. $this->_zmienna_prywatna = $param;
  4. }

To nam załatwia problem elegancko. W ten sposób można przecież inicjalizować jedną klasę obiektami innej klasy... Popatrzcie choćby na inne niż PHP języki. Tam nieraz nie ma jednego ale kilka konstruktorów reagujących na obiekt przesłany jako parametr i dzięki temu można różne wersje konstruktora odpalić.
!*!
To jest tak oczywiste że nie warto o tym wspominać.
Maciek1705
podpowiedź thek podziałała dzięki za pomoc
Szymciosek
Cytat(thek @ 27.06.2012, 22:58:55 ) *
A to nie może użyć konstruktora sparametryzowanego? wink.gif Ludzie... Czy zawsze musi być
new Klasa
a nie może być new Klasa(parametr) questionmark.gif
Poczytajcie manual choćby do dowolnego języka OOP, bo PHP tak też działa
  1. public function __construct($param)
  2. {
  3. $this->_zmienna_prywatna = $param;
  4. }

To nam załatwia problem elegancko. W ten sposób można przecież inicjalizować jedną klasę obiektami innej klasy... Popatrzcie choćby na inne niż PHP języki. Tam nieraz nie ma jednego ale kilka konstruktorów reagujących na obiekt przesłany jako parametr i dzięki temu można różne wersje konstruktora odpalić.


Dobrze, że autor dopiero teraz zauważył, bo już na samym początku napisałem to samo z przekazaniem zmiennej poprzez konstruktor klasy.
thek
@Szymciosek: Ty i !*! też to zrobiliście, ale !*! zamieszał w to jeszcze settera (zupełnie niepotrzebnie, choć już zaznaczył tam konstrukcję __construct($zmienna) ) i stąd może autor się pogubił. Ja tylko nieco mocniej zaznaczyłem, że takie rozwiązanie istnieje i dziwiłem się, że niektórzy tego albo nie zauważyli, albo cudują. Swój punkt przeniosłem na Was obu, bo to Wam się on należy. Ja tylko potrząsnąłem autorem by wrócił "na właściwe tory" wink.gif
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.