Autor | Zpráva | ||
---|---|---|---|
ZurivyProgramator Profil * |
#1 · Zasláno: 29. 2. 2012, 18:51:23
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; } } |
||
Radek9 Profil |
#2 · Zasláno: 29. 2. 2012, 19:27:34
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 |
#3 · Zasláno: 29. 2. 2012, 19:40:50
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 * |
#4 · Zasláno: 29. 2. 2012, 20:24:40
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(); |
||
Bertram Profil |
#5 · Zasláno: 29. 2. 2012, 20:35:32
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 * |
#6 · Zasláno: 29. 2. 2012, 20:39:56
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 |
#7 · Zasláno: 29. 2. 2012, 20:54:49
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); 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 * |
#8 · Zasláno: 29. 2. 2012, 21:02:03
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 |
#9 · Zasláno: 29. 2. 2012, 21:17:49
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 * |
#10 · Zasláno: 29. 2. 2012, 21:19:06
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 |
#11 · Zasláno: 29. 2. 2012, 21:27:24
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 * |
#12 · Zasláno: 29. 2. 2012, 21:37:22
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 * |
#14 · Zasláno: 29. 2. 2012, 21:45:53
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{ } Dal jsem za ni jednou tolik :( |
||
ZurivyProgramator Profil * |
#16 · Zasláno: 29. 2. 2012, 21:58:20
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; } } A na 54 je: public static function Vypis() { 54: return $this->data; } |
||
Bertram Profil |
#17 · Zasláno: 29. 2. 2012, 22:05:11
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 * |
#18 · Zasláno: 29. 2. 2012, 22:17:43
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; } } |
||
Nox Profil |
#19 · Zasláno: 29. 2. 2012, 22:21:16
return $this->format->Vypis(); |
||
ZurivyProgramator Profil * |
#20 · Zasláno: 29. 2. 2012, 22:23:53
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 |
#22 · Zasláno: 29. 2. 2012, 22:30:52
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 * |
#23 · Zasláno: 29. 2. 2012, 22:32:09
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íš? |
||
Časová prodleva: 12 let
|
0