Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasa i zmienne
Forum PHP.pl > Forum > PHP
Memberek
Witam, ostatnio się uczyłem klas, w miarę ogarniam i teraz potrzebuje pomocy, ponieważ nie mogę dojść do tego, jak tworzyć zmienne automatycznie, abym mógł je pobrać.

mam np.
  1. $cos = new cos;
  2. $arr = array(
  3. "Kot" => "perski",
  4. "Pies"=> "bullterier",
  5. );
  6. $cos->tablica($arr);
  7. echo $cos->Pies; // zwraca bullterier
  8.  
  9. class cos {
  10.  
  11. public function tablica ($array) {
  12. foreach($array as $index => $wartosc) {
  13. // jak tutaj?
  14. }
  15.  
  16. }
  17.  
  18. }

mam nadzieje, że zrozumiecie o co chodzi i z góry dziękuję za pomoc, lub chociaż próbę pomocy!
mat-bi
Eee, chyba wiem.

Aby odnieść się do klasy w niej samej, użyj $this, ale powie ci to pierwszy lepszy kurs
Memberek
Cytat(mat-bi @ 1.08.2011, 19:07:38 ) *
Eee, chyba wiem.

Aby odnieść się do klasy w niej samej, użyj $this, ale powie ci to pierwszy lepszy kurs

probowalem
  1. foreach($array as $index => $wartosc) {
  2. $this->$index = $wartosc
  3. }

ale potem nie mogłem pobrać $cos->pies...
Spawnm
Daj $this->{$index} = $wartosc;
Btw. pomysł beznadziejny.
Memberek
Cytat(Spawnm @ 1.08.2011, 19:31:05 ) *
Daj $this->{$index} = $wartosc;
Btw. pomysł beznadziejny.

dzięki działa.

btw. czemu beznadziejny? to co napisałem tylko przykład, funkcja wyciąga dane z bazy danych i używam tego tak:
  1. $player->loadPlayer('Name');
  2. echo "Level: ".$player->level;

mi się wydaje, że to ułatwia smile.gif


a jeszcze jedno pytanie teraz mam tak:
  1.  
  2. function loadPlayer($name) {
  3. $query = $sql->query("SELECT * FROM `players` WHERE `name`='".mysql_real_escape_string($name)."' LIMIT 1");
  4. foreach($sql->fetch($query) as $index => $value){
  5. $this->{$index} = $value;
  6. }
  7. }

a chciałbym np. ułatwić sobię tym sposobem:
  1. $sql->query("SELECT * FROM `players` WHERE `name`='".mysql_real_escape_string($name)."' LIMIT 1")->fetch();

co muszę zrobić? bo wyskakuje, non-object...
buliq
$sql jest globalne?
daj:

  1. function loadPlayer($name) {
  2. global $sql;
  3. $query = $sql->query("SELECT * FROM `players` WHERE `name`='".mysql_real_escape_string($name)."' LIMIT 1");
  4. foreach($sql->fetch($query) as $index => $value){
  5. $this->{$index} = $value;
  6. }
  7. }
Memberek
#up
mam wyżej $sql = new SQL;
ale to nie jest odpowiedzią na moje pytanie, gdyż to akurat działa bez zarzutów, w 4 poście zadałem kolejne pytanie tongue.gif
buliq
daj error_reporting(E_ALL); pokaże coś tam że nie zdefiniowałeś $sql,
$sql zdefiniowane jest w danej metodzie?
Memberek
  1. <?PHP
  2. class MySQL {
  3.  
  4. private $config,$connection,$lQuery;
  5.  
  6. public function __construct() {
  7. require_once("modules/Config.php");
  8. $this->config = new Config;
  9. $this->connection = MySQL_Connect($this->config->value("dbHost"), $this->config->value("dbUser"), $this->config->value("dbPass")) or die("Cannot connect to MySQL");
  10. MySQL_Select_DB($this->config->value("dbName"));
  11. }
  12.  
  13. public function __destruct(){
  14. if($this->connection) MySQL_Close($this->connection);
  15. }
  16.  
  17. public function query($query){
  18. return $this->lQuery = MySQL_Query($query);
  19. }
  20.  
  21. public function numRows($query = null) {
  22. if($query == null && !$this->lQuery) die ("No MySQL Query in MySQL::numRows()");
  23. return MySQL_Num_Rows(($query == null)?$this->lQuery:$query);
  24. }
  25.  
  26. public function fetch($query = null) {
  27. if($query == null && !$this->lQuery) die ("No MySQL Query in MySQL::fetch()");
  28. foreach(MySQL_Fetch_Array(($query == null)?$this->lQuery:$query) as $index => $value){
  29. $this->{$index} = $value;
  30. }
  31. }
  32.  
  33. public function getQuery(){
  34. return $this->lQuery;
  35. }
  36.  
  37. public function insert($table=null, $data=array()){
  38. if($table == null || gettype($data) != "array") die("Wrong param in MySQL::insert(table name, array data)");
  39. $keys = ""; $values = ""; $c=false;
  40. foreach($data as $key => $value){
  41. $keys.= (($c==true)?", ":"")."`$key`";
  42. $values.=(($c==true)?", ":"")."'$value'";
  43. if($c==false) $c=true;
  44. }
  45. return $this->query("INSERT INTO `$table` ($keys) VALUES ($values)");
  46. }
  47.  
  48. public function update($table=null, $data=array(), $param=null){
  49. if($table == null || gettype($data) != "array") die("Wrong param in MySQL::update(table name, array data)");
  50. $d = ""; $c=false;
  51. foreach($data as $key => $value){
  52. $d.= (($c==true)?", ":"")."`$key`='$value'";
  53. if($c==false) $c=true;
  54. }
  55. return $this->query("UPDATE `$table` SET $d $param");
  56. }
  57.  
  58. }
  59. ?>

tu jest moja klasa
buliq
Nie zrozumiałeś mojego przesłania. W metodzie loadPlayer nie masz dostępu do zmiennej $sql ponieważ jej nie zdefiniowałeś. Nie wątpię iż zdefiniowałeś ją wyżej przed wywołaniem metody jednak metoda nie ma dostępu do zmiennej z przypisaną klasą. Błąd non-object informuje ze chcesz użyć zmiennej jako obiektu która de facto obiektem nie jest. Daj global $sql; w metodzie loadPlayer aby miała ona dostęp do obsługi bazy danych. Lub jeżeli nie będzie działać ustaw $sql jako $this->sql - będzie dostęp w całej klasie.
Memberek
dobrze, wiem, ale to co napisałem to przykład i pisałem go podczas pisania postu, uwierz, że mam w moim pliku.

chodzi mi o to, że chce teraz zrobić tak:
$sql->query("TUTAJ ZAPYTANIE DO SQL")->fetch();

i tutaj z fetch() się pojawia non-object. smile.gif
nospor
Przeciez query() zwraca wynik mysql_query czyli resource a to jest dalekie od Twojego obiektu. Zastanów się chwilę co query() ma zwracac by było Twoim obiektem smile.gif
Memberek
hmm
  1. public function query($query){
  2. $this->lQuery = MySQL_Query($query);
  3. return new MySQL;
  4. }

tak?
buliq
Ok. Teraz jasne.

zrób tak:

  1. public function query($query){
  2. return $this->lQuery = MySQL_Query($query);
  3. }


zamień na:

  1. public function query($query){
  2. $this->lQuery = MySQL_Query($query);
  3. return $this;
  4. }


Oczywiście to przykład. Powinieneś w ten sposób przerobić każdą metodę tej klasy który pracuje na danchh z mysql w celu tworzenia takich łańcuchów.

Chodzi o to że $sql->query gdzie $sql jest obiektem. metoda query musi zwrócić obiekt $sql aby można było wykonać metodę tej klasy. Zwracało non-object ponieważ $sql->query zwracało resource z zapytania.
nospor
hmm.... nie wink.gif
po co new? Po co tworzyc nowy obiekt? Zwracaj ten co już jest. A co w obiekcie jest Twoim obiektem? Hm?

i buliq zepsuł myślenie :/
Memberek
dzięki Buliq, wszyscy macie +!
buliq
Sorry nospor smile.gif

Memberek nadal źle.
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.