Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Powazny problem z klasami
Forum PHP.pl > Forum > PHP > Object-oriented programming
ikioloak
Stworzylem klase ktora sluzy do przechowywania informacji o kategoriach:
  1. <?php
  2.  
  3. // Klasa Kategorie
  4. class TCategories
  5. {
  6.   private $count;                               //ilosc kategorii
  7.   private $tablename;                           // nazwa tabeli w bazie mysql
  8.   public $categories=array();                   //tablica obiektow 'kategoria'
  9.  
  10.   public function __construct($tab_name)               //Konstruktor klasy TCategories
  11.   {
  12.     $i=0;
  13.     $this->tablename=$tab_name;
  14.     $query=mysql_query(&#092;"SELECT * FROM $tab_name ORDER BY id\") or die(mysql_error());
  15.     while ($result=mysql_fetch_object($query))
  16.     {
  17.         $this->categories[$i]= new TCategory($result->id,$result->name);
  18.         $i++;
  19.     }
  20.     $this->count=(mysql_num_rows($query)-1);
  21.   }
  22.  
  23.   public function GetTableName()
  24.   {
  25.     return $this->tablename;
  26.   }
  27. }
  28.  
  29. ?>


I klasę przechowującą informacje o danej kategorii:
  1. <?php
  2.  
  3. class TCategory extends TCategories
  4. {
  5.   private $id;
  6.   private $name;
  7.  
  8.   public function __construct($id,$name2)
  9.   {
  10.     $this->id=$id; $this->name=$name2;
  11.     print &#092;"Dodano kategorie id: \".$this->id.\" nazwa:\".$this->name.\"<br>\";
  12.   }
  13.  
  14.   public function ChangeName($name)
  15.   {
  16.     if (isset($name))
  17.      {
  18.        $tab=$this->tablename;
  19.        print &#092;"this = \".$tab;
  20.       $query=&#092;"UPDATE \".parent::GetTableName().\" SET name = '\".$name.\"' WHERE `id` = \".$this->GetID().\" LIMIT 1;\";
  21.        print $query;
  22.        mysql_query($query) or die(mysql_error());
  23.        $this->name=$name;
  24.        return true;
  25.      } else return false;
  26.   }
  27.  
  28. public function GetID()
  29.   {
  30.   return $this->id;
  31.   }
  32. }
  33.  
  34. ?>

dla wyjasnienia TCategory->categories[] to jest tablica obiektow klasy TCategory.
Tworze obiekt:
  1. <?php
  2.  
  3. $categories= new TCategories(&#092;"categories\");
  4.  
  5. ?>


W bazie znajduja juz sie dane wiec do $categories->categories[] ladowane sa informacje z bazy danych. Problem jest gdy chce zmienic nazwe danej kategorii. Chodzi dokladnie o ta linie w metodzie ChangeName() klasy TCategory:

  1. <?php
  2.  
  3. $query=&#092;"UPDATE \".parent::GetTableName().\" SET name = '\".$name.\"' WHERE `id` = \".$this->GetID().\" LIMIT 1;\";
  4.  
  5. ?>

parent:GetTableName() jest pusta zmienna. Chyba w takim razie tak nie mozna. Wiec jak powienienem sie odwolac do wlasnosci klasy TCategories w klasie TCategory?
Imperior
Twoje rozwiązanie zawiera błędy logiczne...
Dlaczego klasa-element dziedziczy od klasy-listy? Tak się nie robi.
W Twoim przypadku tworzysz nowy element, który posiada pola i metody klasy-listy, a tych pól zaś nigdzie nie ustawiasz, więc jak one mają działać?

Poprawki:
Wywal extends całe z TCategory.
Do TCategory dodaj pole w stylu $container, to samo do konstruktora tejże klasy.
W TCategories, gdy tworzysz TCategory, dorzuć $this jako 3 argument.

Teraz wszędzie gdzie chcesz uzyskać nazwę tablicy robisz:
$this->container->GetTableName()

PS. Count zawsze się stosuje jako ilość, zatem bez - 1. Jeśli już to End.
ikioloak
Dzieki wielkie. Zrobilem wszystko jak mowiles i teraz dziala idealnie.
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.