Jump to content
php.lv forumi

global vai $_GLOBALS


Recommended Posts

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?

Link to post
Share on other sites

Izmanto statisko klasi, kur glabāt visus "globālus"!

 

class C11n {

public static

	$database = array(
		'server' => '',
		'user' => '',
		'password' => '',
		'driver' => ''

	),

	$salt = '';

}

 

echo C11n::$salt;

Link to post
Share on other sites

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.

Link to post
Share on other sites

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 by ezis
Link to post
Share on other sites

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 by Jackal
Link to post
Share on other sites

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.

Link to post
Share on other sites

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:

 

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...