Sliipeetais Posted August 29, 2004 Report Share Posted August 29, 2004 Man ir funkcija, iekš kuras ir funkcija no klases. Funkcija no klases: <?php class table { var $html; function returnTable() { $this->html.="</table>\n"; return $this->html; } } ?> Funkcija: function kautkaada(){ $table = new table(); $table->returnTable(); } Rezultātā tiek atgriezta kļūda: Fatal error: Call to a member function on a non-object in //$table->returnTable(); Kur ir problēma? Link to comment Share on other sites More sharing options...
bubu Posted August 29, 2004 Report Share Posted August 29, 2004 Nezinu kā tev, bet man šāds kods: <?php class table { var $html; function returnTable() { $this->html.="</table>\n"; return $this->html; } } function kautkaada(){ $table = new table(); echo $table->returnTable(); } kautkaada(); ?> strādā. Moš pamēģini pats palaist? Vai arī iedod precīzāku kodu, kurš nestrādā. Link to comment Share on other sites More sharing options...
Sliipeetais Posted August 29, 2004 Author Report Share Posted August 29, 2004 (edited) Ahh, visstulbākā kļūda, kāda vien var būt - tabulas izveidošanu biju iebāzis ifā. Kodam sākoties, ifs nenostrādā, tādējādi objekts nemaz neeksistēja. Problēma atrisināta. Edited August 29, 2004 by Sliipeetais Link to comment Share on other sites More sharing options...
deo Posted August 29, 2004 Report Share Posted August 29, 2004 (edited) function returnTable() { $this->html.="</table>\n"; return $this->html; } function kautkaada(){ $table = new table(); $table->returnTable(); } Cik skatos, vinsh tev atgriezh </table>\n, bet funkcijaa ar kuru tu izsauc returnTable, tu neesi noraadiijis ko lai vinsh dara ar to atgriezto veertiibu, respektiivi tu to neizvadi, pameegjini kaa bubu: function kautkaada(){ $table = new table(); echo $table->returnTable(); } Edited August 29, 2004 by deo Link to comment Share on other sites More sharing options...
Sliipeetais Posted August 29, 2004 Author Report Share Posted August 29, 2004 deo, es uzliku echo. neiet tāpāt, turklāt paziņo kļūdu, par kuru rakstīju iepriekš. Link to comment Share on other sites More sharing options...
Kaklz Posted August 30, 2004 Report Share Posted August 30, 2004 pieļauju domu, ka tu klases definīciju esi iznesis citā failā, kuru savukārt esi aizmirsis pēc tam iekļaut ar include/require dzimtas funkcijām, attiecīgi PHP nav nekādas nojausmas, kas ir objekts table. Link to comment Share on other sites More sharing options...
Sliipeetais Posted August 30, 2004 Author Report Share Posted August 30, 2004 (edited) Ahh, tas OOP mani padarīs traku! Līdzko viena problēma atrisināta, uzrodas nākamā. :) Tagad man ir divas klases - viena tabulu veidošanai: <?php class table { var $html; function table($id, $caption='') { $this->html="<table id=\"$id\">\n"; if(!empty($caption)){ $this->html.=" <caption>$caption</caption>\n"; } } function addHeaders() { $this->html.=" <tr>\n"; foreach(func_get_args() as $item) { $this->html.=" <th>$item</th>\n"; } $this->html.=" </tr>\n"; } function addRow($array, $header='') { $this->html.=" <tr>\n"; if(!empty($header)){ $this->html.=" <th>$header</th>\n"; } foreach($array as $item) { $this->html.=" <td>$item</td>\n"; } $this->html.=" </tr>\n"; } function returnTable() { $this->html.="</table>\n"; return $this->html; } } ?> otra form elementiem: <?php class form { var $html; function form($method, $action="index.php") { $this->html="<form method=\"$method\" action=\"$action\">\n"; } function addTextbox($size, $name, $value='') { $this->html.="<input type=\"text\" name=\"$name\" value=\"$value\" size=\"$size\" />\n"; } function addCheckbox($name, $value, $checked='') { $this->html.="<input type=\"checkbox\" name=\"$name\" value=\"$value\" $checked />\n"; } function addGroupboxHead($legend) { $this->html.="<fieldset style=\"padding: 2\">\n<legend>$legend</legend>\n"; } function addGroupboxFoot() { $this->html.="</fieldset>\n"; } function addDropdownboxHead($name) { $this->html.="<select size=\"1\" name=\"$name\">\n"; } function addDropdownboxChoice($value, $text, $selected='') { $this->html="<option value=\"$value\" $selected>$text</option>\n"; } function addDropdownboxFoot() { $this->html.="</select>\n"; } function addSubmitButton($value, $name) { $this->html.="<input type=\"submit\" value=\"$value\" name=\"$name\">"; } function returnForm() { $this->html.="</form>\n"; return $this->html; } } ?> Bet ko darīt situācijā, ja man ir vēlme izveidot Groupbox (no form klases), ievietot iekš tā tabulu (no table klases), un iekš tabulas likt atkal form elementus? Edited August 30, 2004 by Sliipeetais Link to comment Share on other sites More sharing options...
Kaklz Posted August 31, 2004 Report Share Posted August 31, 2004 Ahh, tas OOP mani padarīs traku! Līdzko viena problēma atrisināta, uzrodas nākamā. :) Tagad man ir divas klases - viena tabulu veidošanai: .. otra form elementiem: .. Bet ko darīt situācijā, ja man ir vēlme izveidot Groupbox (no form klases), ievietot iekš tā tabulu (no table klases), un iekš tabulas likt atkal form elementus? Piedrāzt to OOP tādā gadījumā :) Man arī iesākumā likās, ka formas ģenerēt ar OOP palīdzību ir stilīgi, labi, tālejoši domājoši un tā tālāk. Bet tā nav. Katra forma jebkurā gadījumā ir savādāka un prasa savādāku pieeju, tāpēc es ieteiktu aizmirst par OOP kodu, kas ģenerē formas. Daudz vienkāršāk ir ņemt un formas sarakstīt tīrā XHTML un pēc tam vienādi ar CSS noformēt. Tieši to pašu es gribētu teikt par tabulu veidojošo klasi - lai paredzētu visus tabulu veidus, kādus vien var ievajadzēties, tev nāksies 20 reizes izgudrot jaunu divriteni, pie tam tu tikai lieki sarežģīsi savu kodu. OOP ir izmantojams vietās, kur tas dzīvi atvieglo, nevis rada liekas problēmas. Tam visam ir viens iemesls - tu nevari paredzēt un iekļaut visus formas atribūtus savā OOP kodā. Kaut vai viens piemērs - uztaisi man ar savu OOP kodu read-only text input lauku. Ko darīsi? Pārrakstīsi savu klasi. Nākamais piemērs - uztaisi man ar savu OOP kodu teksta lauku, kurā var ierakstīt ne vairāk kā 100 simbolus - atribūts maxlength, atkal vēl viens parametrs, kas ir nododams klases metodei. Tā varētu turpināt līdz bezsamaņai, jo jebkurā brīdī klients var palūgt, lai tu ievieto blakus divus teksta laukus (teiksim, personas kodam) un atkal tev nākas pārrakstīt savu klasi. Tajā pašā laikā, rakstot formas kodu no rokas tu uz šīm izmaiņām vari noreaģēt burtiski dažu minūšu laikā un nebūs jālauza galva par to, vai tavs OOP kods tādu lietu atļauj, vai nē. Link to comment Share on other sites More sharing options...
Sliipeetais Posted August 31, 2004 Author Report Share Posted August 31, 2004 Paldies par padomu, tieši to es arī konkrētajā gadījumā izdarīju :). Link to comment Share on other sites More sharing options...
des Posted October 25, 2004 Report Share Posted October 25, 2004 Tieši to pašu es gribētu teikt par tabulu veidojošo klasi - lai paredzētu visus tabulu veidus, kādus vien var ievajadzēties, tev nāksies 20 reizes izgudrot jaunu divriteni, pie tam tu tikai lieki sarežģīsi savu kodu. OOP ir izmantojams vietās, kur tas dzīvi atvieglo, nevis rada liekas problēmas. Tam visam ir viens iemesls - tu nevari paredzēt un iekļaut visus formas atribūtus savā OOP kodā. Kaut vai viens piemērs - uztaisi man ar savu OOP kodu read-only text input lauku. Nepiekritiishu. Esmu uzrakstiijis sev tabulu gjenereejoshu klasi, ar kuru var sagjenereet jebkaadu tabulu. Par atribuutiem. Prieksh tam man html objektiem ir parametrs $attr, kuraa tad kaa masiivu mieriigi sabaazhu jebkurus taga parametrus, kuri ievajagaas. Saapes saakas tieshi tajaa mirklii, kad pietiekoshi daudz un dinamiskus colspanus un rowspanus jaataisa bez sakariigas OOP pieejas. Taa kaa nav nemaz taa ideja tik slikta, ja visu pietiekoshi flexibli izplaano. Pilniibaa esmu apmierinaats :) Link to comment Share on other sites More sharing options...
Kaklz Posted October 25, 2004 Report Share Posted October 25, 2004 Tieši to pašu es gribētu teikt par tabulu veidojošo klasi - lai paredzētu visus tabulu veidus, kādus vien var ievajadzēties, tev nāksies 20 reizes izgudrot jaunu divriteni, pie tam tu tikai lieki sarežģīsi savu kodu. OOP ir izmantojams vietās, kur tas dzīvi atvieglo, nevis rada liekas problēmas. Tam visam ir viens iemesls - tu nevari paredzēt un iekļaut visus formas atribūtus savā OOP kodā. Kaut vai viens piemērs - uztaisi man ar savu OOP kodu read-only text input lauku. Nepiekritiishu. Esmu uzrakstiijis sev tabulu gjenereejoshu klasi, ar kuru var sagjenereet jebkaadu tabulu. Par atribuutiem. Prieksh tam man html objektiem ir parametrs $attr, kuraa tad kaa masiivu mieriigi sabaazhu jebkurus taga parametrus, kuri ievajagaas. Saapes saakas tieshi tajaa mirklii, kad pietiekoshi daudz un dinamiskus colspanus un rowspanus jaataisa bez sakariigas OOP pieejas. Taa kaa nav nemaz taa ideja tik slikta, ja visu pietiekoshi flexibli izplaano. Pilniibaa esmu apmierinaats :) ja nav žēl, padalies ar kodu un izmantošanas piemēru, paskatīsimies ;) Link to comment Share on other sites More sharing options...
des Posted October 25, 2004 Report Share Posted October 25, 2004 Tieši to pašu es gribētu teikt par tabulu veidojošo klasi - lai paredzētu visus tabulu veidus, kādus vien var ievajadzēties, tev nāksies 20 reizes izgudrot jaunu divriteni, pie tam tu tikai lieki sarežģīsi savu kodu. OOP ir izmantojams vietās, kur tas dzīvi atvieglo, nevis rada liekas problēmas. Tam visam ir viens iemesls - tu nevari paredzēt un iekļaut visus formas atribūtus savā OOP kodā. Kaut vai viens piemērs - uztaisi man ar savu OOP kodu read-only text input lauku. Nepiekritiishu. Esmu uzrakstiijis sev tabulu gjenereejoshu klasi, ar kuru var sagjenereet jebkaadu tabulu. Par atribuutiem. Prieksh tam man html objektiem ir parametrs $attr, kuraa tad kaa masiivu mieriigi sabaazhu jebkurus taga parametrus, kuri ievajagaas. Saapes saakas tieshi tajaa mirklii, kad pietiekoshi daudz un dinamiskus colspanus un rowspanus jaataisa bez sakariigas OOP pieejas. Taa kaa nav nemaz taa ideja tik slikta, ja visu pietiekoshi flexibli izplaano. Pilniibaa esmu apmierinaats :) ja nav žēl, padalies ar kodu un izmantošanas piemēru, paskatīsimies ;) Ok, buushu labs un noshaareeshu vienu zaru no savas laborotorijas :) http://paste.php.lv/1308 http://paste.php.lv/1309 http://paste.php.lv/1310 http://paste.php.lv/1311 http://paste.php.lv/1312 Protams, viss jaaincludo pareizajaa kaartiibaa. Link to comment Share on other sites More sharing options...
Kaklz Posted October 26, 2004 Report Share Posted October 26, 2004 No vienas puses skaisti, taču no otras puses - man piemēram būtu diezgan sarežģīti iebraukt, kas un kā jādara, lai panāktu vajadzīgo efektu, tāpēc arī palieku pie domas, ka gan tabulas, gan cita veida masīvs HTML (tabulas, formas, utt.) ir jābūvē ar šabloniem, nevis ģenerējot ar klasēm. Link to comment Share on other sites More sharing options...
Recommended Posts