Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pytanie dotyczące deklarowania zmiennych
Forum PHP.pl > Forum > PHP > Object-oriented programming
Jarod
Pisząc klase natrafiłem chyba na błąd. Odpalcie sobie poniższy skrypt i napiszcie dlaczego php wyświetla go poprawnie? Przecież prywatna zmienna to _zmienna a nie zmienna exclamation.gif! A skrypt działa poprawnie...

  1. <?php
  2. class Test
  3. {
  4. private $_zmienna = null;
  5.  
  6. public function __construct($zmienna)
  7. {
  8. $this->zmienna = $zmienna;
  9. }
  10.  
  11. public function getZmienna()
  12. {
  13. return $this->zmienna;
  14. }
  15. }
  16.  
  17. $oTest = new Test('2007');
  18. echo 'Wartość zmiennej: ' . $oTest->getZmienna();
  19. ?>
Cysiaczek
To nie błąd. Zważ, że w php możesz tworzyć składowe dynamicznie (publiczne). Zatem masz po prostu dwie zmienne - $_zmienna i $zmienna : )

Pozdrawiam, a życzenia w hydeparku : D
Jarod
Cytat(Cysiaczek @ 1.01.2007, 02:18:45 ) *
To nie błąd. Zważ, że w php możesz tworzyć składowe dynamicznie (publiczne). Zatem masz po prostu dwie zmienne - $_zmienna i $zmienna : )

Czyli jak spróbuję przypisać wartość do nie istniejącej zmiennej, to zostanie on utworzona i będzie publiczna?
To jest totalna głupota..
pawel_k
Cytat(J4r0d @ 1.01.2007, 11:34:26 ) *
Czyli jak spróbuję przypisać wartość do nie istniejącej zmiennej, to zostanie on utworzona i będzie publiczna?
To jest totalna głupota..

to uzywaj metod __set i __get i po sprawie. a glupota to nie jest, za duzo problemow by bylo z dzialaniem skryptow z php4 pod php5
Jarod
Cytat(pawel_k @ 1.01.2007, 11:47:17 ) *
to uzywaj metod __set i __get i po sprawie. a glupota to nie jest, za duzo problemow by bylo z dzialaniem skryptow z php4 pod php5


To bym musiał napisać metode __set() tylko po to, żeby wyświetlać errora, że próbowano zapisać do nie istniejącej zmiennej. Co do działania skryptów pisanych pod php4 to dla mnie php4 nie istnieje. Zresztą pisanie w php4 "obiektowo" też było głupotą.
hwao
  1. <?php
  2. class Test
  3. {
  4. private $_zmienna = null;
  5.  
  6. public function __construct($zmienna)
  7. {
  8. $this->zmienna = $zmienna;
  9. }
  10.  
  11. public function getZmienna()
  12. {
  13. return $this->zmienna;
  14. }
  15.  public function __set( $prop, $value ) {
  16. thrown new Exception( 'Proba a przypisania nie istniejacej wlasnosci "'.$prop.'" wartosci "'.$value.'".' );
  17.  }
  18. }
  19.  
  20. $oTest = new Test('2007');
  21. echo 'Wartość zmiennej: ' . $oTest->getZmienna();
  22. ?>
Jarod
@hwao: rozumiem, tylko jak popisze w innym języku to normalnie trafia mnie że php pozwala na takie głupoty.

Poza tym kiedyś poruszałem temat http://forum.php.pl/index.php?showtopic=59021&hl= na który niestety nikt nie odpowiedział. Skoro w php nie deklarjemy typu zmiennej to dlaczego w logach apacha po pewnym czasie mam dosyć dużo wpisów w stylu "została użyta zmienna, która nie została zadeklarowana.." :/
dr_bonzo
Cytat
tylko jak popisze w innym języku to normalnie trafia mnie że php pozwala na takie głupoty.

Jakim? C++, JAva C#?
Ok, ze skryptowych (ktore znam) Ruby sie czepia niezdefiniowanych zmiennych instancji.

Cytat
Skoro w php nie deklarjemy typu zmiennej to dlaczego w logach apacha po pewnym czasie mam dosyć dużo wpisów w stylu "została użyta zmienna, która nie została zadeklarowana.." :/

NIe typ zmiennej, ale sama zmienna. I tyczy sie to zmiennych globalnych i lokalnych, a nie zmiennych instancji (w obiektach)
Jarod
Cytat(dr_bonzo @ 1.01.2007, 15:03:05 ) *
Jakim? C++, JAva C#?
Ok, ze skryptowych (ktore znam) Ruby sie czepia niezdefiniowanych zmiennych instancji.
NIe typ zmiennej, ale sama zmienna. I tyczy sie to zmiennych globalnych i lokalnych, a nie zmiennych instancji (w obiektach)

Nie chodzi mi o niezdefiniowane zmienne instancji. Ogólnie o niezdefiniowane. A swoją drogą nie sprawdzałem czy w C++/Javie będzie można zapisać do zmiennej instancji, której nie ma. To wyszło przez przypadek jak skorzystałem z podpowiadania składni eclipse - miałem podobne zmienne..
Muszę wyłączyć logowanie i będzie spokój bo apach potrafi zapchać dysk..
dr_bonzo
Cytat
Muszę wyłączyć logowanie i będzie spokój bo apach potrafi zapchać dysk..

Jesli zatkam uszy na negatywna krytyke to wtedy bede idealny.

Nie tedy droga, nie chodzi o ukrywanie widocznych (tych ktore wiesz czemu sie pojawiaja) bledow tylko o ich poprawienie.


Cytat
Nie chodzi mi o niezdefiniowane zmienne instancji. Ogólnie o niezdefiniowane.

Ogolnie to sa to zupelnie rozne przypadki:

$aa = 3; // da ci errora

a

$this->aa = 3; // juz nie


Cytat
A swoją drogą nie sprawdzałem czy w C++/Javie będzie można zapisać do zmiennej instancji, której nie ma.

Ciekawe jak, przeciez to sie nawet nie skompiluje.
Jarod
Cytat(dr_bonzo @ 1.01.2007, 19:15:30 ) *
Jesli zatkam uszy na negatywna krytyke to wtedy bede idealny.

Nie tedy droga, nie chodzi o ukrywanie widocznych (tych ktore wiesz czemu sie pojawiaja) bledow tylko o ich poprawienie.


Rozumiem. Tylko, że w tym projekcie (był pisany strukturalnie) mógłbym poprawić. Tylko, że:
- tablice zdefiniuje jako $tablica = array();
i nie będzie wywalać błędów..

A jak z ze zmiennymi typu string czy integer lub float?
jezoo
php sam rozronia typ danych przypisanych do zmiennej i formatuje ja odpowiedznio wiec sie tym nie musisz martwic smile.gif
Jarod
Cytat(jezoo @ 1.01.2007, 19:20:59 ) *
php sam rozronia typ danych przypisanych do zmiennej i formatuje ja odpowiedznio wiec sie tym nie musisz martwic smile.gif

Nie rozumiesz o co mi chodzi albo ja trochę zamotałem smile.gif

Czyli każdą zmienną (bez względu na jej typ) zanim ją użyje muszę ją zapisać jako np:
  1. <?php
  2. $zmienna1 = null;
  3. $zmienna2 = '';
  4. (...)
  5. // I tu dopiero jakieś operacje na tych zmiennych ?
  6. ?>


Dokładnie w logach apacha mam takie wpisy:
Cytat
Undefined variable: PHP_SELF in usr/local/apache/htdocs/www/index.php on line 358

Z PHP_SELF mam mnóstwo wpisów - z każdego skryptu. Pojawiają się jeszcze wpisy na temat sesji:
Cytat
A session had already been started - ignoring session_start()

Startujemy sesje i jak nam wiadomo, jeśli sesja jest wystartowana to jest kontynuowana a nie tworzona od nowa - więc dlaczego sypie errory do pliku?
jezoo
nie to Ty mnie nie zrozumiales smile.gif albo obaj sie nie rozumimy smile.gif chodzilo mi oto ze w momencie robienia jakis operacji ktore zwracaja jakis wynik (string, int, double, etc...) to w tedy php formatuje je do odpowiedniego typu i nie musisz ich deklarowac jak to przedstawiles w swoim przykladzie smile.gif
Jarod
Cytat(jezoo @ 1.01.2007, 19:34:21 ) *
nie to Ty mnie nie zrozumiales smile.gif albo obaj sie nie rozumimy smile.gif chodzilo mi oto ze w momencie robienia jakis operacji ktore zwracaja jakis wynik (string, int, double, etc...) to w tedy php formatuje je do odpowiedniego typu i nie musisz ich deklarowac jak to przedstawiles w swoim przykladzie smile.gif

Ok to rozumiem. Mi chodzi o to, że w C++ czy innym języku zanim użyjesz w programie zmiennej, musisz ją zadeklarować bo program się nie skompiluje. php tego nie wymaga. Możesz w dowolnym momencie tworzyć zmienne. Ale jak coś takiego zrobisz to apache wrzuca mi do error_log apacha błędy w stylu:
Cytat
Undefined variable: tablica1 in usr/local/apache/htdocs/www/index.php on line 358
cadavre
Cytat
Startujemy sesje i jak nam wiadomo, jeśli sesja jest wystartowana to jest kontynuowana a nie tworzona od nowa - więc dlaczego sypie errory do pliku?
To są akurat notice'y. winksmiley.jpg Zapobiec można definiując start sesji tak:
  1. <?php
  2. if ( !session_id() ) { session_start(); }
  3. ?>


Cytat
$aa = 3; // da ci errora
Taka definicja nie daje przecież errora. Czy ja się mylę?

Sprawdzałem również definicje zmiennych poprzez (typ)$var; - również wywala Notice'a.

EDIT: A co do $_zmienna i $zmienna - php zaleca dobrym nawykiem zapisywanie zmiennych prywatnych poprzedzonych podkreślnikiem .
dr_bonzo
[quoet]Taka definicja nie daje przecież errora. Czy ja się mylę?[/quote]
Ajj, namieszalem. Moj blad. Nie daje. Myslalem o czym innym co innego zapisalem.

Chodzilo o to:
  1. <?php
  2. error_reporting(E_ALL | E_STRICT );
  3.  
  4. $a += 3; // Notice: Undefined variable: a
  5.  
  6. class Haha
  7. {
  8. public function doSth()
  9. {
  10. $this->aa = 3; // bez errora
  11. }
  12. public function doSthElse()
  13. {
  14. $this->sthelse += 3; // bez errora, a to dziwne :)
  15. }
  16. }
  17.  
  18. $hh = new Haha();
  19. $hh->doSth();
  20. $hh->doSthElse();
  21. ?>



Nie chodzi o definicje typu zmiennej tylko o jej deklaracje przed uzyciem, czyli zamiast
  1. <?php
  2. // a jaka wartosc ma $a tutaj?
  3. $a += 3; // ==> $a = $a + 3; i do jakiej wartosci dodajemy 3??
  4. ?>


tak:
  1. <?php
  2. $a = 0;
  3. $a += 3;
  4. ?>





PHP_SELF -- przeciez to od dawna nie istnieje
Jarod
Cytat(dr_bonzo @ 1.01.2007, 20:05:48 ) *
PHP_SELF -- przeciez to od dawna nie istnieje

Nawet nie wiedziałem - działa :/
Co do pozostałych uwag to potestuję i posprawdzam.

Cytat(dr_bonzo @ 1.01.2007, 20:05:48 ) *
PHP_SELF -- przeciez to od dawna nie istnieje

Wogóle skąd masz takie informacje?
dr_bonzo
$_SERVER[ 'PHP_SELF' ] istnieje, PHP_SELF nie

  1. <?php
  2. echo PHP_SELF;
  3. ?>

php Notice: Use of undefined constant PHP_SELF - assumed 'PHP_SELF' in .....


manual:
Cytat
$_SERVER
Note: Introduced in 4.1.0. In earlier versions, use $HTTP_SERVER_VARS.

a sama stala PHP_SELF to juz nie wiem kiedy zostala usunieta.
Jarod
Cytat(dr_bonzo @ 5.01.2007, 23:04:04 ) *
$_SERVER[ 'PHP_SELF' ] istnieje, PHP_SELF nie

No ja cały czas korzystam z $_SERVER[ 'PHP_SELF' ]
dr_bonzo
To czemu mowisz ze PHP_SELF dziala.
ActivePlayer
subtelnie proponuje autorowi zmienic mylną nazwę wątku na cos co bardziej odpowiada prowadzonej dyskusji.
Jarod
Cytat(dr_bonzo @ 5.01.2007, 23:09:57 ) *
To czemu mowisz ze PHP_SELF dziala.


Miałem na myśli $_SERVER['PHP_SELF'] i myślałem, że Ty też o tym piszesz.

No albo inna rzecz. Mam w skrypcie taki zapis:
  1. <?php
  2. $id = intval($_GET['id']);
  3. ?>


Jeśli nie przekazano w urlu id to apache w logach wali błędy "Undefined variable". W ciągu miesiąca pliczek ma 2GB. Wrzuciłem do crona kasowanie logów każdego dnia. Wiem, że moż sprawdzać czy zmienna istnieje i później ją intvalować ale po co? Przecież jak jej nie ma to się nic nie stanie bo później mam odpowiedni warunek, który to sprawdza i w zależności od tego podejmuje odpowiednie zadania.
Nie rozumiem po co apache/php wali to do logów..
sanchoo
Witam! mam problem ze zmiennymi.. chodzi o to ze w funkcji chce dodawac nowe pola... przy wywolaniu z funkjci i dodawac je poprzez arry zmieniajac indkesy smile.gif i sytuacja jest taka.. ze jak zrobie np tak tablica['jaka']="blabla" to po za clasa ja widac ale jak zrobie jeszcze raz tak tablica['jaka2']="222" to ta poprzednia mi znika :/ i przy wyswietleniu nic nie wyswietla (maslo maslane) :/

  1. <?php
  2. class walidacja{
  3.  
  4.  
  5.  public function pustepole($sprawdzany, $pole)
  6.  {
  7.  global $veryfication;  // dalczego musi byc w funkcji? inaczej nie widac jej po za funkcja i klasa
  8.  if(strlen($sprawdzany))
  9.  $veryfication = array('strlen'.$pole => 1); //1 - jesli poprawnie
  10.  else $veryfication = array('strlen'.$pole => 0);
  11.  
  12.  
  13.  }
  14.  
  15. }
  16.  
  17.  
  18.  $sprawdzanie = new walidacja();
  19.  
  20.  $sprawdzanie -> pustepole($_POST['nick'], 'nick');
  21.  $sprawdzanie -> pustepole($_POST['haslo'], 'haslo');
  22.  
  23.  
  24.  
  25.  
  26.  
  27. echo "nick: ".$veryfication["strlennick"]."nn"; nic nie wyswietla!!!! 
  28.  
  29. echo "haslo: ".$veryfication["strlenhaslo"]."nn";
  30. ?>
a to dziala!!![/php]


jak zrobie tak:
  1. <?php
  2. $sprawdzanie -> pustepole($_POST['nick'], 'nick');
  3. echo "nick: ".$veryfication["strlennick"]."nn";wsywietli
  4.  
  5.  $sprawdzanie -> pustepole($_POST['haslo'], 'haslo');
  6. echo "haslo: ".$veryfication["strlenhaslo"]."nn"; i to tez
  7. ?>


Jak mam zadeklarowac ta tabice?? zeby mi w klasie dodawalo nowe indeksy smile.gif

JUZ sie dowiedzialem...
arrau usuwa aktualna tablice smile.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.