Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasa nie widzi zmiennych z poza niej samej.
Forum PHP.pl > Forum > PHP
acztery
witam,

mam taki kod

  1. <?php
  2.  
  3. $example = "test"; // includowane gdzies tam ...
  4.  
  5. class main
  6. {
  7.  
  8. public function ble()
  9. {
  10. echo $example
  11. }
  12. }
  13. ?>


jak zrobic zeby ta klasa ja widzial nie chce stosowac gloabl
NetJaro
  1. <?php
  2. class main
  3. {
  4. public $example = '';
  5. public function ble()
  6. {
  7. echo $example
  8. }
  9. }
  10. ?>


Uzycie:
  1. <?php
  2. $exp = 'exp';
  3. $main = new main;
  4. $main->example = $exp;
  5. ?>
mike
... albo musisz te zaminne przekazać do metody klasy.
  1. <?php
  2.  
  3. $example = "test"; // includowane gdzies tam ...
  4.  
  5. class main
  6. {
  7. public function ble( $var )
  8. {
  9. echo $var
  10. }
  11. }
  12.  
  13. $obiekt = new main();
  14. $obiekt->ble( $example );
  15.  
  16. ?>
acztery
niechce przekazywać caly czas zmiennych.

mam np.

  1. <?php
  2. public function del ($FOR) {
  3. global $meSES,$meUID; // i ja chce zeby bez tego zadzialalo
  4.  
  5. $basket = DB_DataObject::factory('add_basket');
  6. $basket->whereAdd("user_id='$meUID'");
  7. $basket->whereAdd("product_id='$FOR'");
  8. $basket->whereAdd("ses='$meSES'");
  9. $basket->get('ses',$meSES);
  10. $basket->delete();
  11. }
  12. ?>


i jak ja mam przekazywać do kazdej funkcji jakies tam zmienne to chyba malo logiczne rozwazanie. myslalem zeby je ustawic jako super globalne.
i ja chce bez global przekazywanie tak jak napisal NetJaro tez odpada
Coyote
ee tak ja mowisz to sie nie da ... przynajmniej z tego co mi wiadomo i o ile dobrze zrozumialem biggrin.gif
NetJaro
Nie słyszałem o takich możliwościach.. ale prawde mówiąc ciekawy jestem, jak można takie coś zrobić.. o ile można.

Ew. można utworzyć funkcję która będzie tworzyła nową zmienną i nadawała jej daną wartośc, ale to jest jeden z gorszych pomysłów (już lepszy jest mój i mike_mech'a).
acztery
tez nie slyszalem .. ale jest jedeno rozwiazania zmienne ktore maja byc widoczne we wszystkich klasach ustawic je jako superglobalne ale czy to ma snes nie wiem .. wolal bym to miec zrobione tak juz bardziej "profesjonalnie" pod php5
Coyote
ee ustawianie globali nie jest polecane z tego co sie orientuje . przynajmniej nie poleca sie tego .
acztery
ja nie chce urzywac slowa global. dam te zmienne do SUPER GLOBALNE.
Coyote
ale to na to samo wychodzi ... uzywajac OOP nie powinno uzywac sie globali (czy tez super globali) poniewaz to dehermetyzuje klasy ....
acztery
zrobie tak jak pisal NetJaro chodz tak moglem zrobic dawno temu szukalem innego rozwiazania

widzicie tu jakis blad:

  1. <?php
  2. class basket {
  3.  
  4. public $meUID;
  5. public $meSES;
  6.  
  7. private function setRandomBasket() {
  8.  
  9. srand((double)microtime()*1000000);
  10. for($i=0;$i<rand(14,34);$i++) {
  11. $chr=chr(rand(48,122));
  12. if (eregi("[0-9a-zA-Z]",$chr)) $pswd .= $chr;
  13. else $i--;
  14. }
  15. return $pswd;
  16. }
  17.  
  18. public function sum_prince_bsket() {
  19.  
  20.  
  21. $basket = DB_DataObject::factory('add_basket');
  22. $basket->selectAdd();
  23. $basket->selectAdd('SUM(prinall) as value');
  24. $basket->user_id = $meUID;
  25. $basket->ses = $meSES;
  26. $basket->find(TRUE);
  27. return $basket->value;
  28. }
  29. }
  30. ?>


wywolane

  1. <?php
  2. $b = new basket();
  3. $b->meSES = $meSES;
  4. $b->meUID = $meUID;
  5.  
  6. .....
  7. ?>


ale cos nie dziala
KG-
Możesz przekazywać te 2 parametry do konstruktora, wtedy taki obiekt utworzyłby sobie swoją ich kopię jako składniki prywatne i na nich pracował.
Coyote
a wyzuca Ci jakis error ?
acztery
nie, nic nie pokazuje wlasnie...
athabus
acztery - zrób tak jak mówi KG- czyli użyj konstruktora i po sprawie.
Zmień też zmienne wewnątrz klasy na private bo zmienne public w klasie aż w oczy rażą blink.gif

Ideą stojącą za OOP jest ograniczanie dostępu do wszystkiego co się da, tak aby móc jak najmniej zapsuć. //oczywiscie jest to uproszczony opis
Klasa ma mieć swoje API, za pomocą którego możesz nią manipublować. Teraz to sobie możesz zrobić małe kuku taki jak np:

  1. <?php
  2. $objBasket=new Basket()
  3. $objBasket->meUID='czemu ta zmienna jest stringiem?questionmark.gif';
  4. $objBasket->meSES='dostęp bezpośredni do zmiennych klasy jest niebezpieczny';
  5. ?>


Jeśli klasa wymaga dostępu do zmiennej to zrób metody dostępowe, które będą kontrolowały aby przypadkiem nie przypisać do zmiennej typu int stringa czy czegokolwiek niezgodnego z twoją wizją.

Dobrze że rezygnujesz z superglobali/globali itd. W OOP nie powinieneś tego stosować - obiekt ma dostać pewne parametry, przetworzyć je i coś zwrócić. Pamatetry muszą być przekazywane jawnie do obiektu, tak aby niezależnie od otoczenia w którym się znajdzie zawsze zwrócił to samo. Jeśli obiekt jest zależny od jakiejś zmiennej typu global to ten warunek nie jest spełniony. Wiadomo, że czasem oznacza to więcej pisania - można się zastanawiać po co tworzyć kopię zmiennej w obiekcie, gdy mamy ją już w skrypcie zdefiniowaną - ale tu chodzi o bezpieczeństwo - za pół roku coś tam będziesz zmieniał i usuniesz/zmienisz nazwę tej zmiennej, a to spowoduje konsekwencje, których nie można przewidzieć. Lepiej napisać trochę więcej, ale zaoszędzić czas przy poprawkach i zmianach.
acztery
a mam takie pytanie dotyczace deklarowanie zmiennych w php5

  1. <?php
  2. $getMeUID = "jestem meUID";
  3.  
  4.  
  5. class b {
  6.  
  7. public $getMeUID;
  8. public function __construct($meUID, $meUID){
  9.  
  10. $meUID = ($meUID=="")?$meUID:$meUID;
  11. $meSES = ($meSES=="")?$meSES:$meSES;
  12.  
  13. }
  14.  
  15. public  function getMeUID() 
  16. {
  17.  
  18. echo $this->getMeUID;
  19. }
  20. }
  21.  
  22.  
  23. $my = new b($meUID,$meUID);
  24. $my->getMeUID = $getMeUID;
  25. ;
  26.  
  27. echo $my->getMeUID();
  28.  
  29.  
  30. ?>


wszystko mam public ale nie wiem czy nie potrzebnie jak zmienie getMeUID na private a reszte na static to kapa error o braku dostpeu do obiektu czy metody....
athabus
acztery - nie wiem czy dobrze zrozumiałem zamysł, dla jakiego stworzyłeś ten program, ale chyba coś pokręciłeś ze zmiennymi itd.

Na początek wstaw sobie coś takiego na początku skryptu
  1. <?php
  2. ?>
- dzięki temu będą wyświetlane wszelkie ostrzerzenia itp (domyślnie php nie wyświetla wszystkiego. Oczywiście w wersji ostatecznej skryptu lepiej to usunać, ale przy projektowaniu jak najbardziej się przydaje.

W twoim przykładzie serwer zwrócił aż 4 ostrzeżenia.


Klasę możesz napisać np. tak (pozwoliłem sobie nieco zmienić nazewnictwo zmiennych/funkcji, bo konwencja, którą przyjmujesz trochę jest myląca. Dalej nie wiem od czego pochodzi skrót meUID czy meSES ale je zostawiłem bez zmian).

  1. <?php
  2. $meUID = 'jestem meUID';
  3.  
  4. class b
  5. {
  6.  
  7. private $meUID;
  8. private $meSES;
  9. public function __construct($meUID='', $meSES='')
  10. {
  11. $this->meUID=$meUID;
  12. $this->meSES=$meSES;
  13. }
  14.  
  15. public function getMeUID()
  16. {
  17.  
  18. return $this->meUID;
  19. }
  20. public function setMeUID($newValue)
  21. {
  22. //tutaj możesz sprawdzić czy $newValue spełnia twoje wymagania
  23. //np czy ma odpowiednią wartość, czy jest stringiem itp
  24. //jeśli sprawdziłeś to możesz spokojnie nadać wartość
  25.  //np sprawdzamy czy string nie jest pusty - oczywiście należałoby jeszcze sprawdzić czy to w ogóle jest string itp
  26. if ($newValue=='')
  27. {
  28. throw new Exception ('string nie moze byc pusty');
  29. }
  30. else
  31. {
  32. $this->meUID=$newValue;
  33. }
  34. }
  35. //odpowiednie funkcje get i set musisz dopisac do kazdej zmiennej do ktorej
  36. //chcesz miec dostep z poza klasy
  37. }
  38.  
  39. $obj = new b ('foo', 'bar');
  40. echo $obj->getMeUID();
  41. ?>

//edit
PS. Oczywiscie można również użyć metod magicznych __get i __set do dostępu do zmiennych
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.