Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Tablice w php 5.2.0, Elementy tablic nie dodają się tak jak w php 5.1.1: $aArray[]
Athlan
post
Post #1





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

Ostrzeżenie: (0%)
-----


Witam Was… Ostatnio zainstalowałem sobie nowy serwer (zrobiłem update) z php 5.1.1 na 5.2.0. W rezultacie połowa tablic przestała mi działać… pięknie co? Powiem szczeże że się zdenerwowałem jak nic… już kilka dni badam o co chodzi. Przykładowy kod z widoku mojego frameworka:

  1. <?php
  2. $oView->aError = array(); //declare an array
  3. var_dump($oView->aError); // it will output: Array( )
  4.  
  5. $oView->aError[] = '1';  // add element to array...
  6. $oView->aError[] = 2;  // ... some int? ...
  7. $oView->aError[] = '3';  // ... and string ...
  8.  
  9. var_dump($oView->aError); // it output: Array( )
  10. // hmmm, it should output: Array( [0] => string(1), "1" [1] => int(1), "2" => string(1) "3" )
  11. ?>


Obiekt $oView oczywiście został wcześniej zainicjowany. Przejdźmy do rzeczy… Zaraz po zadeklarowaniu tablicy sprawdzamy ją tak dla pewności, że jest. „No dziwne by było żeby jej nie było” (masło maślane ale prawda sama w sobie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )

Ok. jedziemy dalej… dodajemy do tablicy kolejne elementy poprzez użycie [] – co to oznacza każdy wie. Po dodaniu elementów lumpujemy tablice po raz kolejny. O dziwo jest pusta (IMG:http://forum.php.pl/style_emoticons/default/blink.gif) .

Przypominam, że zrobiłem update z php 5.1.1 na 5.2.0. Czyżby wlepili tam jakiegoś buga? Zaraz po updacie ta część kodu przestała działać. Podobnie warstwa ACL, gdzie klasa User w podobny sposób sama sobie dodaje grupy użytkownika – dziwiłem się, że do żadnego kontrolera nie mam dostępu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Teraz wszystko jasne. Zainteresowało mnie to, przeprowadziłem testy. Napisałem dwa przykłady, które działają…

Test 01:
  1. <?php
  2. $aArray = array();
  3.  
  4. $aArray[1] = 'first element';
  5. $aArray[2] = 'second element';
  6. $aArray[3] = 'third element';
  7.  
  8. var_dump($aArray);
  9. ?>


Test 02:
  1. <?php
  2. class ArrayTest
  3. {
  4. private $aAttributes = array();
  5.  
  6. public function __construct()
  7. {
  8. $this->aAttributes['TestCase'] = array();
  9. }
  10.  
  11. public function __destruct()
  12. {
  13. var_dump($this->aAttributes['TestCase']);
  14. }
  15.  
  16. public function __get($sName)
  17. {
  18. return $this->aAttributes['TestCase'][$sName];
  19. }
  20.  
  21. public function __set($sName, $mValue)
  22. {
  23. return $this->aAttributes['TestCase'][$sName] = $mValue;
  24. }
  25. }
  26.  
  27. $oArrayTest = ArrayTest();
  28.  
  29. $oArrayTest->FirstElement = 1;
  30. $oArrayTest->SecondElement = 2;
  31. $oArrayTest->ThirdElement = 3;
  32. ?>

Co jest nie tak? Może załącze jeszcze klase mojego widoku I usera, aby pokazać, że dodaję elementy w taki sam sposób:

User Class (patrz metody setGroup(), hasGroup(), getGroup() )
http://phpfi.com/179458
View Class (patrz metody __get(), __set() )
http://phpfi.com/179456

Ten post edytował Athlan 28.11.2006, 16:37:22
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
cassis
post
Post #2





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 4.12.2006

Ostrzeżenie: (0%)
-----


maly przyklad
przed uzyciem skontaktuj sie z baza dany i przeczytaj SQLowa ulotke nizej

  1. <?php
  2. class Cars {
  3. protected $items;
  4.  
  5. public function __get( $model) {
  6. if ($this->items === null) {
  7. $query = 'SELECT * FROM cars';
  8. $result = mysql_query( $query);
  9. while ($row = mysql_fetch_assoc( $result)) {
  10. $this->items[$row['model']] = $row['description'];
  11. }
  12. }
  13. if (false == isset( $this->items[$model])) {
  14. throw new Exception( 'nie ma takiej pozycji');
  15. }
  16. return( $this->items[$model]);
  17. }
  18.  
  19. public function __set( $model, $description) {
  20. try {
  21. $this->__get( $model);
  22. $query = 'UPDATE cars SET description=''.$description.'' WHERE model=''.$model.''';
  23. mysql_query( $query);
  24. } catch( Exception $e) {
  25. $query = 'INSERT INTO cars (model, description) VALUES (''.$model.'', ''.$description.'')';
  26. mysql_query( $query);
  27. }
  28. $this->items[$model] = $description;
  29. }
  30. }
  31.  
  32. $cars = new Cars();
  33. $cars->skarpeta = 'fajne auto';
  34.  
  35. try {
  36. echo $cars->skarpeta;
  37. } catch (Exception $e) {
  38. echo $e;
  39. }
  40. ?>


  1. CREATE TABLE `cars` (
  2. `model` varchar(255) NOT NULL,
  3. `description` text NOT NULL,
  4. PRIMARY KEY (`model`)
  5. )


Oczywiscie mozna to usprawniac na wiele sposobow. Zastosowania __get() __set() sa bardzo przydatne.
Zauwaz ze tutaj moznaby zamiast rzucac wyjatek w przypadku braku rekordu zwrocic jakas domyslna wartosc. Wedlug mnie dzieki tego typu rozwiazaniom kod staje sie abrdziej przejrzysty i elegancki. Nieco ciezej sie wykrywa bledy ale mozna zrobic rzeczy bardziej uniwersalne, elastyczne i wielokrotnie wykorzystywac (IMG:http://forum.php.pl/style_emoticons/default/aaevil.gif) . Moznaby do tej klasy dodac licznik zapytan i mase innych gadzetow...
Mam nadzieje ze przekonalem nieco...
Pisane na szybko wiec wybaczcie jakies bledy...
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.09.2025 - 01:08