Autor Zpráva
ZurivyProgramator
Profil *
Ahoj, mám třídu, která bude zapisovat data do databáze. v konstruktoru přijímá název tabulky, data a proměnou, která když bude true, tak se data budou nějak formátovat. No a s tím je právě problém. hlásí mi to tuto chybu:
Catchable fatal error: Object of class FormatInput could not be converted to string in C:\xampp\htdocs\Object\DatabaseObject.php on line 60
class WriteInDb
   protected $table;
   protected $data;
   protected $format;

   function __construct($tableName,$data=array(),$Format)
   {
     $this->table = $tableName;
     $this->data = $data;
     if(($this->format = $Format) == true)
     $this->data = new FormatInput($this->data);
   }
   public function Vrat()
   {
    return $this->data;
   }
}
class FormatInput
{
  protected $data;
  function __construct($data)
  {
    $this->data = $data;
  }
  public function Vypis()
  {
    return $this->data;
  }
}
Nevíte co s tím? a jaké jsou vlastně způsoby propojování tříd? používám dědění, ale třída WriteInDb už dědí třídu, která se připojuje k databázi, takže víc už jich použít nemůžu. Děkuju za radu
Radek9
Profil
ZurivyProgramator:
Asi se snažíš tu instanci vypisovat i přes to, že nemá definovanou metodu __toString. Co je na daném řádku chybového souboru? (+ Na okolních.)
Bertram
Profil
ZurivyProgramator:
Ahoj, nejspíš používáš echo na metodu vypis(), ale ve vlastnosti $data je objekt.
Také bych upravil konstruktor třídy WriteInDb, zbytečně přepisuješ $this->data pokud je $format true.
ZurivyProgramator
Profil *
Betram:
No pokud je format true, dám ty data které přišli do konstruktoru tříde FormatInput a ta by mi je pak měla vrátit zpět do data, takže potom bude v data už formátovaný výstup.
Jinak chyba je na řádku 60 a tam je echo:
$pole = array("Pondeli","Utery");
$w = new WriteInDb("Ahoj",$pole,1);
echo $w->Vrat();
Jak to tedy mám pořešit?
Bertram
Profil
Ve vlastnosti $data bude buď pole nebo objekt, takže vlasně nevím co od dané metody očekáváš za výstup?
ZurivyProgramator
Profil *
No od metody z FormatInput očekávám opět pole. mám tam jenom tak danou metodu výpis, abych viděl jestli to funguje. Ale vracet bude pole. a když o tom tak přemýšlím, tak ani nevím jak volat metody z té třídy Format v třídě WriteInDb
Bertram
Profil
ZurivyProgramator:
Přijde mi zvláštní, že třída, která se jmenuje WriteInDb, má jedinou metodu, která vrací pole a to ať "zformátované???" nebo surové, jak ho dostala v konstruktoru.
Každopádně kódem,
$this->data = new FormatInput($this->data);
přiřadíš do vlastnosti $data objekt nikoli pole.
Ale ani tak s echem na poli moc nenaděláš.
Možná by jsi mohl prozradit co od toho kódu očekáváš za funkčnost.
ZurivyProgramator
Profil *
No tak ta jedna metoda to je jenom pokus, hlavně jsem chtěl zjistit funkčnost konstruktoru a jestli vůbec funguje to propojení těch dvou tříd. Jinak tady potom bude metoda, která bude ukládat do db.
Celý princip je takový že v třídě Write budou metody pro zápis do db. Zapsání celého pole dat do databáze, potom metoda která zapíše jen jednu hodnotu atd.
No a v té třídě na formátování se např. bude kontrolovat jestli jsou data zprávně zadána atd. Plus když budu mít další třídu Výpis z db, tak ta získá od této třídy data vypsaná z db a vypíše je bud v tabulce nebo ve sloupečkách apod...
Bertram
Profil
ZurivyProgramator:
hlavně jsem chtěl zjistit funkčnost konstruktoru a jestli vůbec funguje to propojení těch dvou tříd
Konstruktor primárně slouží k sestavení objektu na základě předaných parametrů.
Nevím, jak myslíš to propojení, ale ty jsi udělal to, že jsi do vlastnosti jednoho objektu vložil instanci objektu druhého.

tak ta získá od této třídy data vypsaná z db a vypíše je bud v tabulce nebo ve sloupečkách apod...
Zkus pohledat návrhový vzor dekorátor.
ZurivyProgramator
Profil *
No jde mi vlastně o to, abych mohl metody z jedné třídy používat v druhé. dědění použít nemůžu protože třída write už jednu třídu dědí
Bertram
Profil
Na to dědění pozor, má se používat jen pokud je prokazatelné, že jde o určitý "typ" rodičovské třídy.
Pokud v nějakém objektu vytvoříš instanci objektu jiného, má nad ním stejnou moc, jako z okolního kódu, což znamená, že může přistupovat pouze k veřejným metodám a vlastnostem.
ZurivyProgramator
Profil *
jestli to chápu dobře, tak když udělám uvnitř třídy instanci jiné třídy, tak mohu používat její metody pokud budou public nebo protected?
Bertram
Profil
pouze public.
protected i v podtřídách (extends)
private pouze v kontextu třídy
ZurivyProgramator
Profil *
Ok, tak díky za pomoc. Jinak prosím tě neznáš nějakou literaturu nebo webové stránky, které se zabývají návrhem objektů? našel jsem sice pár stránek kde je vysvětlená syntaxe a všechno, ale mě dělá největší problém ten návrh celého systému, všech objektů, vždycky něco dělám a pak to desetkrát předělávám, protože to jde napsat lépe
Bertram
Profil
vždycky něco dělám a pak to desetkrát předělávám, protože to jde napsat lépe
Jsme dva :)
Zatím považuji za nejpřínosnější knihu PHP 6, ale i když začíná od vytvoření jednoduchého,
class Trida{
}
tak to rychle nabírá na rychlosti a myslím si, že základy jsou nutné jako ochrana proti trudomyslnosti :)
Dal jsem za ni jednou tolik :(
ZurivyProgramator
Profil *
Tak jsem to tedka předělal, vytvářím instanci objektu format ve formatu write a hlásí mi to chybu, někdy dělám něco špatně:
class WriteInDb extends DatabaseConnection
{
   protected $table;
   protected $data;
   protected $format;
   function __construct($tableName,$data=array(),$Format)
   {
     $this->table = $tableName;
     $this->data = $data;
     if(($this->format = $Format) == true)
     $this->format = new FormatInput($this->data);
   }
   public function Vrat()
   {
    return $this->format->Vypis();
   }
}
class FormatInput
{
  protected $data;
  function __construct($data)
  {
    $this->data = $data;
  }
  public static function Vypis()
  {
    return $this->data;
  }
}
Hlásí to: Fatal error: Using $this when not in object context in C:\xampp\htdocs\Object\DatabaseObject.php on line 54
A na 54 je:
  public static function Vypis()
  {
54:    return $this->data;
  }
Bertram
Profil
Statické metody nemohou pracovat s nestatickými vlastnostmi objektu, což vyplívá už z toho, že je lze zavolat bez vytvoření instance.
ZurivyProgramator
Profil *
No tak jo, statický metody jsem zrušil a stále nic. omlouvám se za mojí natvrdlost, ale teprve začínám :)
class WriteInDb extends DatabaseConnection
{
   protected $table;
   protected $data;
   protected $format;
   function __construct($tableName,$data=array(),$Format)
   {
     $this->table = $tableName;
     $this->data = $data;
     if(($this->format = $Format) == true)
     $this->format = new FormatInput($this->data);
   }
   public function Vrat()
   {
 42:   return $this->format = Vypis();
   }
}
class FormatInput
{
  protected $data;
  function __construct($data)
  {
    $this->data = $data;
  }
  public function Vypis()
  {
    return $this->data;
  }
}
Fatal error: Call to undefined function Vypis() on line 42
Nox
Profil
return $this->format->Vypis();
ZurivyProgramator
Profil *
Děkuji, už to funguje
Majkl578
Profil
Bertram:
Zatím považuji za nejpřínosnější knihu PHP 6
Knihu, jejíž samotný název je naprosto zcestný (PHP 6 neexistuje), bych rozhodně nikomu nedoporučil.

ZurivyProgramator:
Opravdu by ses měl prvně věnovat kvalitní literatuře, než tu budeš slepě zkoušet smyslpostrádající kódy.
Třída WriteInDb nedává smysl – neměla by dědit od DatabaseConnection (ale pouze ji využívat), zároveň se (z toho kousku kódu co jsi uvedl) chová nepředvídatelně (např. metoda Vrat cosi kdesi meziukládá do své vlastnosti a navíc volá globální funkci). Třída FormatInput postrádá existenční význam – může to být obyčejná metoda.
Bertram
Profil
Majkl578:
Knihu, jejíž samotný název je naprosto zcestný (PHP 6 neexistuje), bych rozhodně nikomu nedoporučil.
O tom vím, ale já jsem mu doporučoval její obsah nikoli název.
Navíc dopředný pohled v PHP není nic tak neobvyklého, jak určitě sám víš.
ZurivyProgramator
Profil *
Jak jsem psal výše ty metody v obou třídách jsou jenom zkouškové jestli mi funguje propojení těch tříd a to nefungovalo, tak jsem dál nepokračoval.
neměla by dědit od DatabaseConnection (ale pouze jej využívat) - jak to myslíš?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0