Jackal Posted July 29, 2007 Report Posted July 29, 2007 (edited) Nu man ir, piemēram, faili aaa.php include("klase.php"); $tpl = new tpl; $klase = new klase; $klase -> funkcija(); klase.php class klase{ function funkcija(){ $tpl->kaut_kada_funkcija(); } } Problēma ir tāda ka funkcija "kaut_kada_funkcija" netiek izsaukta, jo $tpl objekts tiek taisīts failā aaa.php un negribas viņu taisīt iekš klases "klase". Kā pareizi izsaukt funkciju "kaut_kada_funkcija"? Ceru, ka sapratāt. Edited July 29, 2007 by Jackal
bubu Posted July 29, 2007 Report Posted July 29, 2007 $tpl = new tpl(); $klase = new klase(); $klase->funkcija($tpl); class klase { function funkcija($t) { $t->kaut_kada_funkcija(); } } Vai arī, ja daudzām funkcijām vajag to $tpl, tad padod klases to $tpl klases konstruktorā un saglabā member variablī.
mefisto Posted July 29, 2007 Report Posted July 29, 2007 Es varbūt kaut ko jaucu, bet vai tad nevajdzētu izmantot references ? http://lv.php.net/manual/en/language.references.php Tādā veidā šajā kodā $tpl = new tpl(); $klase = new klase(); $klase->funkcija($tpl); class klase { function funkcija($t) { $t->kaut_kada_funkcija(); } } .. patiesībā būtu jābūt function funkcija(&$t){ $t->kaut_kada_funkcija(); } Protams ļoti iespējams ka es kļūdos.
bubu Posted July 29, 2007 Report Posted July 29, 2007 Iekš php5 visi objekti automātiski tiek padoti pēc references. php4 es ignorēju, jo tā jau ir vēsture ;) http://lv.php.net/manual/en/language.oop5.basic.php When assigning an already created instance of a class to a new variable, the new variable will access the same instance as the object that was assigned. This behaviour is the same when passing instances to a function.
Jackal Posted July 29, 2007 Author Report Posted July 29, 2007 Vai arī, ja daudzām funkcijām vajag to $tpl, tad padod klases to $tpl klases konstruktorā un saglabā member variablī. Nesanāca uztaisīt pēc šī varianta, jo nemāku vēl īsti oop. To $tpl vajag ļoti daudzām funkcijām un negribās katrai funkcijai padot atsevišķi. Varbūt iedosiet kādu piemēru?
bubu Posted July 29, 2007 Report Posted July 29, 2007 Nesanāca uztaisīt pēc šī varianta, jo nemāku vēl īsti oop. Būtu labāk parādījis kas tev sanāca, nevis teicis, ka nekas nesanāca. http://catb.org/~esr/faqs/smart-questions.html#code class klase { var $t; function __construct($t) { $this->t = $t; } function funkcija() { $this->t->kaut_kada_funkcija(); } } $tpl = new tpl(); $klase = new klase($tpl); $klase->funkcija();
andrisp Posted July 29, 2007 Report Posted July 29, 2007 Man tieši nesen līdzīgu variantu vajadzēja. Izlīdzējos līdzīgi kā bubu variantā, tikai nedaudz savādāk. (Man vajadzēja vienkāršu veidu, kā klasēm piesaistīt datubāzes objektu. Un datubāzes objekts bija domāts izmantot vienu uz visām klasēm.) Nezinu vai tas ir labākais risinājums, bet neko savādāk nevarēju izdomāt. $db = new Db(); class klase { var $db; function __construct() { if (isset($GLOBALS['db']) && is_object($GLOBALS['db'])) { $this->db = $GLOBALS['db'] } } function funkcija() { $this->db->kaut_kada_funkcija(); } }
bubu Posted July 29, 2007 Report Posted July 29, 2007 Tavu vajadzīgo lietu sauc par Singleton pattern'u. Design pattern'i (hvz kā latviski) ir noderīga lieta. Ja redzi, ka tavā gadījumā der kāds patterns, tad daudz nebūs jādomā par koda uzbūvi, jo katram patterna koda realizācija ir diezgan skaidra. Pamata patternus der iemācīties - interface, facade, delegate, composition. Drusku krutākus ar der zināt - factory, lazy initialization, singleton, proxy, observer, visitor, strategy, state, utt
Recommended Posts