ezis Posted March 18, 2011 Report Share Posted March 18, 2011 hey. Pēdējā laikā bieži nākas lasīt, ka global labāk neizmantot. Cik skatos, tad tik un tā, daudz mainīgie ir "importēti" funkcijā ar global palīdzību. Kā tad labāk rīkoties, ja tas nav tik forši? $_GLOBALS vai kāda cita metode? Man ir db klase. Kādai funkcijai viņu vajag, tad ko man darīt? function foo(){ global $db; $db->query(... } Tātad nav foršs variants. Jāsāk jau it kā pievērsties vairāk MVC, tad nu domāju arī sākt visu darīt glītāk, bet kā tas būtu? Quote Link to comment Share on other sites More sharing options...
EdgarsK Posted March 18, 2011 Report Share Posted March 18, 2011 es domaju, ka tu vari vnk metodei uzlikt public un izsaukt to statiski <?php class dbclass { public function query($db){ ... } } function foo(){ dbclass::query("..."); } Quote Link to comment Share on other sites More sharing options...
daGrevis Posted March 18, 2011 Report Share Posted March 18, 2011 Izmanto statisko klasi, kur glabāt visus "globālus"! class C11n { public static $database = array( 'server' => '', 'user' => '', 'password' => '', 'driver' => '' ), $salt = ''; } echo C11n::$salt; Quote Link to comment Share on other sites More sharing options...
ezis Posted March 18, 2011 Author Report Share Posted March 18, 2011 Kāds tad īsti ir ļaunums, ja izmanto global? Quote Link to comment Share on other sites More sharing options...
EdgarsK Posted March 18, 2011 Report Share Posted March 18, 2011 ne, nu es vnk saku :) es jau izmantoju static.. function db(){ static $a,$b; if(!$b){ $b=true; $a=new APP_Database; } return $a; } usage: db()->method(..); Quote Link to comment Share on other sites More sharing options...
codez Posted March 18, 2011 Report Share Posted March 18, 2011 Kāds tad īsti ir ļaunums, ja izmanto global? Ja programmē lapu, kas sastāv no viena php faila, tad nekāds, bet, ja pamatīgu aplikāciju vairāku mēnešu garumā un to kodē 5 koderi un php failu skaits mērās simtos, tad ej nu sazin kādus globālos ir ieviesuši citi programmētāji un nenonāksi konfliktā: pēkšņi aplikācija sāk dīvaini uzvesties, utt. Quote Link to comment Share on other sites More sharing options...
ezis Posted March 18, 2011 Author Report Share Posted March 18, 2011 (edited) Tad jau nav īpaša negatīva iespaida servera darbībā, ja es "piesārņoju" global :? Man īsti nav to zināšanu kā tur tas notiek. Variable ir globāls līdz brīdim, kad viņu jāpieprasa kādā funkcijā. Tad izmanto iespēju global. Bet ko tas maina? Tas "piegruzī" atmiņu vai arī vienkārši dod iespēju? Tad pēc codez spriestā sanāk, ka tas ir vairāk stila jautājums? Edited March 18, 2011 by ezis Quote Link to comment Share on other sites More sharing options...
Jackal Posted March 18, 2011 Report Share Posted March 18, 2011 (edited) Jā, šis ir mūžam neatrisināmais jautājums. global problēma ir tāda, ka to var jebkurā vietā pārdefinēt. Visām globalajām metodēm likt static, manprāt, arī ir sūdīgs risinājums, bet tās gan ir manas domas. Pēdējā laikā esmu nonācis pie tā, ka nav tāda universāla risinājuma šai problēmai. Ir jākombinē singleton, factory, dependency injection, utt., pēc vajadzības. Piemēram, neiesaku db klasi taisīt kā singleton, jo nebūs iespēja izveidot vairākas konekcijas datubāzei, ja būs vajadzība. To ezis: jā, tas tiešam ir vairāk stila jautajums, ja tev ērti ir izmantot global,tad izmanto to, atmiņu tas "nepiegruzī" Edited March 18, 2011 by Jackal Quote Link to comment Share on other sites More sharing options...
Val Posted March 18, 2011 Report Share Posted March 18, 2011 paga, paga, global nav tas pats, kas $_GLOBALS... Quote Link to comment Share on other sites More sharing options...
codez Posted March 19, 2011 Report Share Posted March 19, 2011 global un $GLOBALS pēc būtības dara vienu un to pašu, tikai ar dažādu pierakstu. Globals izmantošanai ar performanci nav nekāda sakara. Drīzāk ar loģisku aplikācijas struktūru. Kādi ir tie dati, struktūras, kurām vajadzēt piekļūt globāli? Parasti tās ir dažādas bibliotēkas un tām nepieciešami objekti, piemēram db bibliotēka ar datubāzes konekcijas objektu. Manuprāt visērtākais veids, kā piekļūt globāliem objektiem, ir izmantot tieši klašu funkcionalitāti, kurām ir tāda laba lieta kā autoload un otrs ir būvēt klašu izvietošanas struktūru failu sistēmā tā, lai nebūtu iespējams izveidot divas vienādas klases. Šī klase var kā glabāt konstantes jau programmas kodā, vai nodrošināt to ielasīšanu un kešosānu no kādiem ini vai tamlīdzīgiem failiem. Piemēram, izveidojam konstanšu klasi: class Consts{ static public $max_messages_per_day=10; } un tālāk kodā izmantojam echo Consts::$max_messages_per_day; ja gadījumā klase Consts nav ielādēta, tad izveidojam autoload metodi, lai tā ielādē failu ar šo klasi. Ja mēs sākam vienkārši failos veidot mainīgos, tad lielā projektā, kuru iespējams veido vairāki cilvēki, var sanākt ielaist kļūdas, kuru atrašana un labošana var būt diezgan ķēpīgs darbs. Piemēram 1. programmētājs taisa kādu bilbiotēku un tajā izveidojis $max globālo mainīgo, ko izmanto vairākās funkcijās. Bet otrs programmētājs taisa kādu lapas attēlošanas daļu, kurā izmanto šīs bilbiotēkas un arī izmanto savu globālo mainīgo $max, tikai citām vjadzībām, tā rezultātā aplikācija nestrādā kā vajag un neviens nevar saprast kāpēc. Quote Link to comment Share on other sites More sharing options...
wintermute Posted March 19, 2011 Report Share Posted March 19, 2011 Vispār jau PHP klašu konstantes definē šadi: class Test { const REAL_CONSTANT = 20; } echo Test::REAL_CONSTANT; Kas attiecas uz globalo mainīgo lietošanu, varbūt būt vērts pamācīties OOP: (youtube) Are global variables bad? (stackoverflow) Why Global Variables in PHP is Bad Programming Practice Global Variables Are Bad Quote Link to comment Share on other sites More sharing options...
codez Posted March 19, 2011 Report Share Posted March 19, 2011 IMHO, ar const nevar definēt masīvus, kā man parasti glabājas lielākā daļa konstanšu, tāpēc nākas izmantot statiskos mainīgos: class Consts { static public $languages=array('lv','en'); } 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.