404 Posted May 6, 2012 Report Share Posted May 6, 2012 Ir konfig fails ar masīvu: $setup no kura klases konstruktorā tiek dinamiski saģenerēti klases mainīgie: public function __construct() { require 'config.php'; foreach($setup as $classVar => $value) { $this->{$classVar} = $value; } } Ir kaut kāda iespēja viņiem uzsetot redzamību uz 'private',jeb jāsamierinās,ka šādā veidā variabļi vienmēr būs publiski? Quote Link to comment Share on other sites More sharing options...
briedis Posted May 6, 2012 Report Share Posted May 6, 2012 Nav jau obligāti jāliek kā lauki. Izmanto __set un __get. Pašas vērtības glabā masīvā, kas ir privāts. Ar __get vienkārši neļauj piekļūt vērtībām. Papēti __set un __get: http://php.net/manual/en/language.oop5.magic.php Ir pat paraugs: http://www.php.net/manual/en/language.oop5.magic.php#99453 Quote Link to comment Share on other sites More sharing options...
404 Posted May 6, 2012 Author Report Share Posted May 6, 2012 Šis veids derētu ļoti labi,bet tā tiek zaudēta iespēja salikt visu vajadzīgo ārējā konfigā. Tad viss ir jāliek iekš klases masīva un zūd jēga to darīt dinamiski. Jeb kļūdos? Quote Link to comment Share on other sites More sharing options...
101111 Posted May 6, 2012 Report Share Posted May 6, 2012 Ja jāatbild uz jautājumu, tad, jā, izmantojot refleksiju to laikam izdarīt var: http://www.php.net/manual/en/reflectionproperty.setaccessible.php $refObject = new ReflectionObject( $thisj ); $refProperty = $refObject->getProperty( $classVar ); $refProperty->setAccessible( false); Bet vai tā rīkoties ir pareizi konkrētajā situācijā, tas varētu būt cits jautājums (nezinu priekš kam tas viss ir vajadzīgs). Quote Link to comment Share on other sites More sharing options...
404 Posted May 6, 2012 Author Report Share Posted May 6, 2012 (edited) Ja jāatbild uz jautājumu, tad, jā, izmantojot refleksiju to laikam izdarīt var: http://www.php.net/m...taccessible.php Ja esmu pareizi sapratis, tad tad refleksija vienkārši izveido objekta kopiju un visas izmaiņas attieksies vienīgi uz to bez iespējas ietekmēt "īstos" klases variabļus,tā ka laikam tas īsti nederēs. Bet vai tā rīkoties ir pareizi konkrētajā situācijā, tas varētu būt cits jautājums (nezinu priekš kam tas viss ir vajadzīgs). Galvenā motivācija-iznest visu konfigurāciju ārējā failā,lai nav jāaiztiek klases katru reizi,kad ir vajadzība ko pamainīt. Edited May 6, 2012 by 404 Quote Link to comment Share on other sites More sharing options...
daGrevis Posted May 7, 2012 Report Share Posted May 7, 2012 Šādi neder? :) https://gist.github.com/2626411 Quote Link to comment Share on other sites More sharing options...
404 Posted May 7, 2012 Author Report Share Posted May 7, 2012 (edited) Paldies-tieši tas kas vajadzīgs. Kā reiz iedeva apgaismību,kā viegli norealizēt Brieža ieteikto :) private $_config; public function __construct() { require 'config.php'; $this->_config = $setup; } public function __get($key) { return isset($this->_config[$key]) ? $this->_config[$key] : ''; } Edit: Bet šādi atkal ir problēma ka aizsargāts ir vienīgi pats $_config masīvs,bet __get viņa saturam tāpat ļaus piekļūt ārpus klases. To ir iespējams kaut kā nokontrolēt? Edited May 7, 2012 by 404 Quote Link to comment Share on other sites More sharing options...
Kavacky Posted May 7, 2012 Report Share Posted May 7, 2012 Tak sadefinē, ko atļaut un ko nē. __get nočeko, vai vajadzīgajam _config elementam ir publiska pieejamība. Quote Link to comment Share on other sites More sharing options...
404 Posted May 7, 2012 Author Report Share Posted May 7, 2012 Laikam jau no hardkodēšanas izmukt neizdosies. Ienāca prātā vēl doma,ka varētu uztaisīt whitelist masīvu,uzskaitot publiskos,bet arī tas nestrādā izrādās :D http://stackoverflow.com/questions/3479036/emulate-public-private-properties-with-get-and-set 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.