Jackal Posted February 6, 2009 Report Share Posted February 6, 2009 Iekš OOP vēl nav tik labas zināšanas un gribētu attrast labāku variantu. Nepatīk izmantot global katrā funkcijā, kur nepieciešams kāds objekts, piemēram, template. Ir pamata klases kā db, template, log, utt. Vajadzētu viņas padarīt pieejamas pilnīgi visur (citos objekotos) arī savā starpā. Esmu lasijis par singleton patternu, bet tā līdz galam neesmu iebraucis kā tas strādā. Te it kā būtu singleton piemērs no php.net <?php class Example { // Hold an instance of the class private static $instance; // A private constructor; prevents direct creation of object private function __construct() { echo 'I am constructed'; } // The singleton method public static function singleton() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; } return self::$instance; } // Example method public function bark() { echo 'Woof!'; } // Prevent users to clone the instance public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } } ?> Cik saprotu, lai varētu šo objektu, kuram ir singleton patterns, izmantot citā klasē, tad man vajag darīt kaut kā tā <?php class klase{ var $test; function __construct(){ $this->test = Example::singleton(); } function show(){ $this->test->bark(); } } ?> Vai pareizi esmu sapratis? Ja jā tad šis variants arī neliekas tas labākais, jo tad tik pat labi šī vietā "$this->test = Example::singleton();" var darīt arī tā: <?php $test = new Example(); class klase{ var $test; function __construct(){ global $test; $this->test = $test; } function show(){ $this->test->bark(); } } ?> Īsti nepatīk tas, ka katras klases konstruktorā sanāk rakstīt vienu un to pašu un, ja kādreiz nāk kāda klase klāt, tad arī jāpalabo visu pārējo klašu konstruktori, it kā jau nekad tās klases nebūs tik daudz, ka to nevarēs izdarīt, bet nu kā jau rakstiju, gribās atrast labāku variantu, protams, ja tāds vispār ir. Ir idejas? Link to comment Share on other sites More sharing options...
marcis Posted February 6, 2009 Report Share Posted February 6, 2009 (edited) class klase extends Example { function show(){ $this->bark(); // vai // parent::bark(); } } Tas, protams, atkarībā no vajadzības un cik ļoti viena klase balstās uz otras. Edited February 6, 2009 by marcis Link to comment Share on other sites More sharing options...
Kaklz Posted February 6, 2009 Report Share Posted February 6, 2009 ja tu raksti PHP5, tad vari droši rakstīt arī šādi: Class klase{ function show(){ Example::singleton() -> bark(); } } Link to comment Share on other sites More sharing options...
Jackal Posted February 6, 2009 Author Report Share Posted February 6, 2009 (edited) class klase extends Example { function show(){ $this->bark(); // vai // parent::bark(); } } Tas, protams, atkarībā no vajadzības un cik ļoti viena klase balstās uz otras. Šis variants derētu, ja man būtu viena globālā klase, bet diemžēl tādas ir vairākas (vismaz četras). Bija doma darīt līdzīgi, tikai klasē, kuru extendoju visām pārējām klasēm, glabāt izveidotos objektus. Mēģināju, jau tādā veidā uztaisīt, bet īsti nestrādāja. Edited February 6, 2009 by Jackal Link to comment Share on other sites More sharing options...
marcis Posted February 6, 2009 Report Share Posted February 6, 2009 Nu tad jāizmanto klase::funckija() vai global. Citu variantu diezvai būs. Link to comment Share on other sites More sharing options...
NiTrino Posted February 6, 2009 Report Share Posted February 6, 2009 (edited) Vēl ir Registry patterns, kurā var sabāzt visas globālās klases kas tev ir. http://www.sitecrafting.com/blog/php-patterns-part/ Edited February 6, 2009 by NiTrino Link to comment Share on other sites More sharing options...
Jackal Posted February 6, 2009 Author Report Share Posted February 6, 2009 No pirmā acu uzmetiena liekas, ka Registry patterns būs tieši tas, kas vajadzīgs Paldies! Link to comment Share on other sites More sharing options...
marcis Posted February 6, 2009 Report Share Posted February 6, 2009 Principā jau tas Registry paterns arī ir tas pats klase::fukcija() Link to comment Share on other sites More sharing options...
Recommended Posts