ray Posted March 5, 2015 Report Share Posted March 5, 2015 Ir iespējams kaut ko šādu realizēt, lai strādātu? class Main { function setValue($classes = array()) { foreach($classes as $key => $value) $this->$key = $value; } } class Modules extends Main { function showValue($key) { return $this->$key; } } $main = new Main; $main->setValue( array( 'adc'=>123, 'def'=>456 ) ); $modules = new Modules; echo $modules->showValue('def'); Quote Link to comment Share on other sites More sharing options...
codez Posted March 5, 2015 Report Share Posted March 5, 2015 Tu setValues izsauc un viena objekta, bet showValues uz cita. Mantojās klases, nevis objekti.$modules nekādi nevar zināt, ka $main ir tieši "parent" objekts, jo var būt daudz dažādi Main klases objekti.Bet, ja vēlies kaut ko piesaistīt pie klases, tad jāizmanto statiski mainīgie. Lai gan es neko tamlīdzīgu nekad nerakstītu, šeit piemērs: <?php class Main { static $values = array(); function setValue($classes = array()) { foreach($classes as $key => $value) self::$values[$key] = $value; } } class Modules extends Main { function showValue($key) { return self::$values[$key]; } } $main = new Main; $main->setValue( array( 'adc'=>123, 'def'=>456 ) ); $modules = new Modules; echo $modules->showValue('def'); Quote Link to comment Share on other sites More sharing options...
e-remit Posted March 5, 2015 Report Share Posted March 5, 2015 Šitā derēs? class Main { protected static $vars; function setValue($classes = array()) { foreach($classes as $key => $value) self::$vars[$key] = $value; } } class Modules extends Main { function showValue($key) { return parent::$vars[$key]; } } $main = new Main; $main->setValue( array( 'adc'=>123, 'def'=>456 ) ); $modules = new Modules; echo $modules->showValue('def'); Quote Link to comment Share on other sites More sharing options...
ray Posted March 5, 2015 Author Report Share Posted March 5, 2015 Varbūt ir kāds "gudrāks" veids kā šo realizēt nemainot lietas būtību? Tas ir vajadzīgs tāpēc, lai pirmajā klasē definētos mainītie ko varētu izmantot citās klasēs lieki nepārrakstot vienas un tās pašas rindas. Piemēram, tulkošanas, db utml parametrus. Quote Link to comment Share on other sites More sharing options...
Kaklz Posted March 5, 2015 Report Share Posted March 5, 2015 Pilnīgs offtopic, bet lūdzu šo: foreach($classes as $key => $value) self::$values[$key] = $value; raksti kā: foreach($classes as $key => $value) { self::$values[$key] = $value; } un tavi kolēģi tev teiks paldies, nevis būs gatavi tevi nosist. Quote Link to comment Share on other sites More sharing options...
codez Posted March 5, 2015 Report Share Posted March 5, 2015 Tev vajag izmantot Dependancy Injection, piemēram šo: http://pimple.sensiolabs.org/ Izveido servisus priekš tulkošanas, priekš db, utt. un ieliec konteinerī un tālāk piekļūsti tiem no konteinera. Šādā veidā tu varēsi arī nodrošināt vieglu testēšanu, jo testējot varēsi konteinerī atbilstošiem servisiem salikt mock servisus. Quote Link to comment Share on other sites More sharing options...
F3llony Posted March 5, 2015 Report Share Posted March 5, 2015 Varbūt ir kāds "gudrāks" veids kā šo realizēt nemainot lietas būtību? Tas ir vajadzīgs tāpēc, lai pirmajā klasē definētos mainītie ko varētu izmantot citās klasēs lieki nepārrakstot vienas un tās pašas rindas. Piemēram, tulkošanas, db utml parametrus. Lietas būtība ir, ka tu to dari nepareizi; <?php class Tulkojumi{ /// bla } class Datubaze{ /// bla } class Whatever{ private $tulkojumi; private $datubaze; function __construct(Tulkojumi $tulkojumi, Datubaze $datubaze) { $this->tulkojumi = $tulkojumi; $this->datubaze = $datubaze; } function blah(){ $this->datubaze->betmens("SELECT Gotham FROM Watman"); } } $tulkojumi = new Tulkojumi; $db = new Datubaze; $whatever = new Whatever($tulkojumi, $db); $whatever->blah(); Un organizēt to var ar dependency injection. Piemēram, labs ir Orno/DI aļa thephpleague/container. Pimplis arī nav slikts, bet man tomēr nedaudz besī. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted March 9, 2015 Report Share Posted March 9, 2015 Un neviens pats nav funkcijām uzlicis access level... Nedz arī type hinting parametram, kuram obligāti jābūt masīvam: public function setValue(array $classes = array()) Quote Link to comment Share on other sites More sharing options...
briedis Posted March 9, 2015 Report Share Posted March 9, 2015 array() omg, so oldschool. Kurš tādu vēl lieto? Quote Link to comment Share on other sites More sharing options...
Kavacky Posted March 9, 2015 Report Share Posted March 9, 2015 Un neviens pats nav funkcijām uzlicis access level... Ja vajag public, tad kāpēc pārcensties? Quote Link to comment Share on other sites More sharing options...
F3llony Posted March 9, 2015 Report Share Posted March 9, 2015 Un neviens pats nav funkcijām uzlicis access level... Nedz arī type hinting parametram, kuram obligāti jābūt masīvam: public function setValue(array $classes = array()) Ko mels niekus? :> Man ir gan visibility, gan typehinti, un kā Kavacs teica, public ir public. Quo vadis, Juri :> Quote Link to comment Share on other sites More sharing options...
jurchiks Posted March 10, 2015 Report Share Posted March 10, 2015 (edited) I like to be explicit. Tas nenozīmē pārcensties, bet gan vienkārši censties rakstīt, lai nav jādomā. @briedis - ja tu par jauno masīvu sintaksi, man tā nepatīk, var sabojāt koda lasāmību, ja apvieno array access ar array creation (piemēram, $arr[] = [] var uz brīdi samulsināt, un man tas nepatīk). Edited March 10, 2015 by jurchiks Quote Link to comment Share on other sites More sharing options...
briedis Posted March 10, 2015 Report Share Posted March 10, 2015 I like to be explicit. Tas nenozīmē pārcensties, bet gan vienkārši censties rakstīt, lai nav jādomā. @briedis - ja tu par jauno masīvu sintaksi, man tā nepatīk, var sabojāt koda lasāmību, ja apvieno array access ar array creation (piemēram, $arr[] = [] var uz brīdi samulsināt, un man tas nepatīk). "var sabojāt koda lasāmību" :D Protams, skaitīt iekavas ir daudz patīkamāk, ja tiek iejautkas funkcijas pa vidu ;) $wow = stdClass::someshit(array('array' => array('array' => array(date('', strtotime('tomorrow'))))))); $arr[] = [] - Nu ja šāda rindiņa samulsina, nu tad nez...... Quote Link to comment Share on other sites More sharing options...
Kavacky Posted March 10, 2015 Report Share Posted March 10, 2015 [..]Izņemot to, ka tur tad būtu divu veidu iekavas un redzams, kur beidzas funkcijas, kur masīvi[..] Exactly + īsāk Quote Link to comment Share on other sites More sharing options...
jurchiks Posted March 10, 2015 Report Share Posted March 10, 2015 (edited) To each his own. OP postā bija array(), so fuck off. Besides: stdClass::someshit(array('array' => array('array' => array(date('', strtotime('tomorrow'))))))); -> stdClass::someshit(array( 'array' => array( 'array' => array( date('format?', strtotime('tomorrow')) ) ) )); Atklājās, ka tev tur bija 1 par daudz aizverošās iekavas. GJ. Edited March 10, 2015 by jurchiks Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.