PHP konstantna preglasitev. Konstante v PHP. Za kaj se uporabljajo konstante in ali ni lažje uporabljati spremenljivk?

Konstante- to so vrednosti, ki se s časom ne spreminjajo. Že iz šole verjetno poznate številne konstante, na primer število p, številka e, pospešek prosti pad in drugi. In seveda je pri programiranju zelo pogosto treba tudi vnesti konstante. In o tem, kako ustvarite in uporabite konstante v PHP, o tem bomo govorili v tem članku.

Gremo s teboj ustvarimo konstantoštevilke p:

definiraj (PI, 3.1415926);
odmev PI;
?>

Operater opredeliti ustvarja konstantna P.I. in mu dodeli vrednost 3.1415926 . Nato izpišemo to konstanto prek operatorja odmev. Vse je zelo preprosto, vendar obstaja eno priporočilo, ki vam ga svetujem, da ga vedno upoštevate. Bodite prepričani, da napišete konstante z velikimi tiskanimi črkami. Ne da je to nujno, je pa zelo zaželeno. In to je običajno ne samo v PHP, ampak tudi v drugih jezikih.

Seveda kasneje sprememba konstanta PI ne bo dovoljen (zato ona konstantna).

Zdaj pa poglejmo eno funkcijo, ki preverja: " Ali je podana konstanta definirana?". Napišimo ta skript:

if (!defined("PI")) define(PI, 3.1415926);
odmev PI;
?>

Tukaj preveri se obstoj konstante P.I.. In če ne obstaja (tj funkcijo define(). vrnil lažno), potem inicializiramo to konstanto. Nato ga preprosto prikažemo.

Kot lahko vidite, ustvarite in uporabite svoje konstante v PHP- je zelo preprosto.

In končno, rad bi govoril o vgrajene PHP konstante. Napišimo preprost skript:

phpinfo();
?>

Proti koncu je razdelek " PHP spremenljivka"Pravzaprav to ni povsem konstante vendar so konstante pri izvajanju tega skripta. Seveda, ko se izvede drug skript, bodo imele različne vrednosti (seveda ne vse). Peljiva vaju ven kot par konstante, da boste razumeli, kako delati z njimi, saj se uporabljajo neverjetno pogosto:

echo $_SERVER["REMOTE_ADDR"];
odmev "
";
echo $_SERVER["QUERY_STRING"];
?>

V tem skriptu izpišemo IP naslov uporabnika, ki je zagnal skript, v naslednji vrstici pa prikažemo poizvedbeni niz (na primer " index.php?id=7"). Če pogledam malo naprej, pravim, da tukaj sodelujemo z globalnim polje $_SERVER. Z nizi bomo spoznali kasneje, vendar mislim, da bodo tisti, ki so delali z nizi v drugih programskih jezikih, brez težav prepoznali sintakso. Kar se tiče drugih konstante, potem delo z njimi poteka na enak način.

Za vsak izveden skript. Mnoge od teh konstant definirajo različni moduli in bodo prisotne samo, če so ti moduli na voljo prek dinamičnega nalaganja ali statičnega sestavljanja.

Obstaja devet magičnih konstant, ki spreminjajo svoj pomen glede na kontekst, v katerem se uporabljajo. Na primer vrednost __LINE__ odvisno od vrstice v skriptu, v kateri je podana ta konstanta. Vse čarobne konstante se razrešijo v času prevajanja, za razliko od običajnih konstant, ki se razrešijo med izvajanjem. Posebne konstante ne razlikujejo med velikimi in malimi črkami in so navedene spodaj:

Nekaj ​​čarobnih PHP konstant
Ime Opis
__LINE__ Trenutna številka vrstice v datoteki.
__MAPA__ Celotna pot in ime trenutne datoteke z razširjenimi simbolnimi povezavami. Če se uporablja znotraj vključene datoteke, se vrne ime te datoteke.
__DIR__ Imenik datotek. Če se uporablja znotraj vključene datoteke, se vrne imenik te datoteke. To je enako klicanju dirname(__FILE__). Vrnjeno ime imenika se ne konča s poševnico, razen za korenski imenik.
__FUNKCIJA__ Ime funkcije oz (zaključek) v primeru anonimne funkcije.
__RAZRED__ Ime razreda. To ime vsebuje ime imenskega prostora, v katerem je bil razred deklariran (npr. Foo\Bar). Upoštevajte, da od PHP 5.4 __CLASS__ deluje tudi v lastnostih. Ko se uporablja v metodah lastnosti, je __CLASS__ ime razreda, v katerem se metode uporabljajo.
__LAST__ Ime lastnosti. To ime vsebuje imenski prostor, v katerem je bila lastnost deklarirana (npr. Foo\Bar).
__METOD__ Ime metode razreda.
__NAMESPACE__ Ime trenutnega imenskega prostora.
Ime razreda :: razred Polno ime razred (ki označuje imenski prostor). Glej tudi ::class.

Poglej tudi get_class(), get_object_vars(), file_exists() in funkcija_obstaja().

Seznam sprememb

pred 14 leti

Razlika med
__FUNCTION__ in __METHOD__ kot v PHP 5.0.4 je to

FUNCTION__ vrne samo ime funkcije

medtem ko as __METHOD__ vrne ime razreda skupaj z imenom funkcije

razredni trik
{
funkcija doit()
{
echo __FUNCTION__;
}
funkcija doitagain()
{
echo __METHOD__;
}
}
$obj=nov trik();
$obj->doit();
izhod bo ---- doit
$obj->doitagain();
rezultat bo ----- trick::doitagain

pred 13 leti

Čarobna konstanta __CLASS__ lepo dopolnjuje funkcijo get_class().

včasih potrebujete spoznati oboje:
- ime podedovanega razreda
- ime dejansko izvedenega razreda

Tu je primer, ki prikazuje možno rešitev:

Razred osnovni_razred
{
funkcija say_a()
{

" ;
}

Funkcija say_b()
{

" ;
}

razred derived_class razširja osnovni_razred
{
funkcija say_a()
{
parent::say_a();
echo ""a" - je rekel " . __RAZRED__ . "
" ;
}

Funkcija say_b()
{
parent::say_b();
echo ""b" - je rekel " . get_class($this) . "
" ;
}
}

$obj_b = nov izpeljani_razred();

$obj_b -> say_a();
odmev "
" ;
$obj_b -> say_b();

?>

Izhod bi moral izgledati približno takole:

"a" - je rekel osnovni_razred
"a" - je rekel derived_class

"b" - je rekel derived_class
"b" - je rekel derived_class

3 leta nazaj

Upoštevajte majhno nedoslednost pri uporabi __CLASS__ in __METHOD__ v lastnostih (stojalo php 7.0.4): medtem ko __CLASS__ deluje, kot je oglaševano, in dinamično vrne ime razreda, v katerem se uporablja lastnost, bo __METHOD__ dejansko dodal pred ime lastnosti namesto ime razreda!

pred 8 leti

V različicah pred 5.3.0 ni mogoče implementirati nazaj združljivega __DIR__.

Edina stvar, ki jo lahko naredite, je, da izvedete rekurzivno iskanje in zamenjate v dirname(__FILE__):
najti . -tip f -print0 | xargs -0 sed -i "s/__DIR__/dirname(__FILE__)/"

pred 5 leti

Veliko opomb se tukaj nanaša na definiranje čarobne konstante __DIR__ za različice PHP, ki ne podpirajo funkcije. Seveda lahko definirate to čarobno konstanto za različice PHP, ki te konstante še nimajo, vendar bo izgubila svoj namen takoj, ko boste uporabili konstanto v vključeni datoteki, ki je lahko v drugem imeniku kot datoteka, ki definira konstanto __DIR__ . Kot taka je konstanta izgubila svojo *čarovnijo* in bi bila precej neuporabna, razen če se prepričate, da imate vse svoje vključitve v istem imeniku.

Zaključek: opomba gmaila dot com o tem, ali lahko ali ne morete definirati čarobnih konstant, je veljavna, vendar izjava, da definiranje __DIR__ ni neuporabno, ni!

pred 7 leti

Ne morete preveriti, ali je magična konstanta definirana. To pomeni, da ni smisla preverjati, ali je __DIR__ definiran, nato pa ga definirati. `defined("__DIR__")` vedno vrne false. Definiranje __DIR__ v PHP 5.3+ bo tiho odpovedalo. To lahko povzroči težave z združljivostjo, če vaš skript vključuje druge skripte.

echo (defined ("__DIR__" ) ? "__DIR__ je definiran" : "__DIR__ NI definiran" . PHP_EOL );
echo (definirano ("__FILE__" ) ? "__FILE__ je definirano" : "__DATOTEKA__ NI definirano" . PHP_EOL );
echo (definirano ("PHP_VERSION" ) ? "PHP_VERSION je definirano" : "PHP_VERSION NI definirano" ) . PHP_EOL ;
echo "Različica PHP: ". PHP_VERSION. PHP_EOL ;
?>
Izhod:
__DIR__ NI definiran
__FILE__ NI definiran
PHP_VERSION je definiran
Različica PHP: 5.3.6

Zadnja posodobitev: 1.11.2015

Konstante, tako kot spremenljivke, hranijo določeno vrednost, vendar za razliko od spremenljivk lahko konstantam vrednost nastavimo samo enkrat, potem pa je ne moremo spreminjati. Na primer, definirajmo numerično konstanto:

Če želite definirati konstanto, uporabite operator define, ki ima naslednjo obliko: define(string $name, string $value, bool $case_sen=false) . Parameter $name posreduje ime konstante, parameter $value pa njeno vrednost. Tretji izbirni parameter ima logično vrednost prav ali lažno. Če je vrednost false, se pri uporabi konstante upoštevajo njene velike in male črke; če je resnična, se velike in male črke ne upoštevajo. V našem primeru tretji parameter ni uporabljen, zato je privzeto false.

Ko definiramo konstanto, jo lahko uporabljamo kot običajno spremenljivko. Edina izjema je, da njegove vrednosti ne bomo mogli spremeniti. Druga razlika pri spremenljivki je, da vam ni treba uporabiti znaka $. To je izraz ŠTEVILO=33; ne bo delovalo.

Vnaprej določene konstante

Poleg konstant, ki jih ustvari programer, ima PHP več vgrajenih konstant:

    FILE__ : shrani celotno pot in ime trenutne datoteke

    LINE__ : shrani trenutno številko vrstice, ki jo tolmač obdeluje

    DIR__: shrani imenik trenutne datoteke

    FUNCTION__ : ime funkcije, ki se obdeluje

    CLASS__ : ime trenutnega razreda

    METHOD__ : ime metode, ki se obdeluje

    NAMESPACE__ : ime trenutnega imenskega prostora

Na primer, natisnimo trenutno vrstico, ki se izvaja, in ime datoteke:

Preverjanje obstoja konstante

Če želite preveriti, ali je konstanta definirana, lahko uporabimo funkcijo bool defined(string $name). Če je definirana konstanta $name, bo funkcija vrnila true

Konstanta je identifikator (ime) za preprosto vrednost. Kot že ime pove, se njihova vrednost med izvajanjem skripta ne more spremeniti (razen za čarobne konstante, ki dejansko niso konstante). Imena konstant privzeto razlikujejo med velikimi in malimi črkami. Po dogovoru so imena konstant vedno zapisana z velikimi črkami.

Ime konstante mora slediti enakim dogovorom o poimenovanju kot druga imena v PHP. Veljavno ime se začne s črko ali podčrtajem, ki mu sledi poljubno število črk, številk in podčrtajev. Vsakdanje izražanječe želite preveriti pravilnost imena konstante, je videti takole: ^*$

Konstante je mogoče definirati s funkcijo definiraj () rezervirana ali celo neveljavna imena, katerih vrednosti je mogoče pridobiti (samo) prek funkcije konstanta(). Vendar to ni priporočljivo.

Primer #1 Pravilna in nepravilna imena konstant

// Popravi imena konstant
definiraj ("FOO", "nekaj");
definiraj ("FOO2", "nekaj drugega");
define ("FOO_BAR" , "nekaj več" );

// Nepravilna imena konstant
definiraj ("2FOO", "nekaj");

// To je veljavna deklaracija, vendar je bolje, da je ne uporabljate:
// PHP lahko nekega dne registrira čarobno konstanto,
// kar bo pokvarilo skript
define ("__FOO__", "nekaj");

?>

Komentiraj: Koncept "črke" je tukaj znaki a-z, A-Z in drugi znaki s kodami ASCII od 128 do 255 (0x80-0xff).

2 leti nazaj

Zmogljivost konstant. PHP 7.1.10 32 bitov (Opcache aktiven, windows 10 i7-64 bitov), ​​vendar so očitno trendi enaki pri 5.x

z uporabo konstante, deklarirane z DEFINE("CNS",vrednost): 0,63575601577759s
z uporabo konstante, deklarirane s const CNS=vrednost: 0,61372208595276s
z uporabo spremenljivke, deklarirane z $v=vrednostjo: 0,51184010505676s

V povprečju je uporaba DEFINE in CONST približno enaka z nekoliko boljšim delovanjem CONST namesto DEFINE. Vendar je uporaba spremenljivke približno 10–50 % boljša kot uporaba konstante. Torej za nalogo, ki zahteva veliko zmogljivost, konstanta ni najboljša možnost.

$p1=mikročas(true);
$x=0;
za($i=0;$i<50000000;$i++) {
$x+=CNS;
}
$p2=mikročas(true);

pred 14 leti

Nedefinirana konstanta se oceni kot resnična, če ni pravilno uporabljena. Recimo, da ste imeli nekaj takega:

nastavitve.php
// Način odpravljanja napak
definiraj ("DEBUG", false);
?>

test.php
include("settings.php" );

če (DEBUG) (
// odmev nekaterih občutljivih podatkov.
}
?>

Če se iz nekega razloga settings.php ne vključi in konstanta DEBUG ni nastavljena, bo PHP ŠE VEDNO natisnil občutljive podatke. Rešitev je, da jih ocenite. Takole:

nastavitve.php
// Način odpravljanja napak
definiraj ("DEBUG", 0);
?>

test.php
include("settings.php" );

if (DEBUG == 1) (
// odmev nekaterih občutljivih podatkov.
}
?>

Zdaj deluje pravilno.

V tej objavi bomo ugotovili, v čem je razlika PHP oglas konstante z uporabo ključne besede const in funkcije define().

Konstante v PHP so "konstante", katerih vrednosti so določene samo enkrat in jih nato ni mogoče spremeniti. Če poskusite spremeniti vrednost, se ta ne bo spremenila in pojavila se bo opomba PHP: "Konstanta je že določena":

Definiraj ("FOO", "val"); definiraj ("FOO", "val2"); // Obvestilo: Konstanta je že definirana echo FOO; //> val

Obstajata dva načina za deklaracijo konstant v PHP:

// 1 define("NAME", "VALUE"); // 2 const NAME = "VREDNOST";

Vsaka metoda ima svoje značilnosti, da bi jih razumeli, poglejmo vse korak za korakom, kako in kaj se je spremenilo z vsako različico PHP.

Kako ustvariti konstante

PHP manj kot 5,3

Pred različico 5.3 v PHP je bilo mogoče konstante definirati le z uporabo define(). Ključna beseda const se je pojavila v različici 5.3.

Samo skalarji lahko shranijo konstante. Skalarne spremenljivke so spremenljivke s tipi integer, float, string in boolean. Tipi matrike, predmeta in vira niso skalarni.

// skalarji define("FOO", 10); definiraj ("FOO", 10.9); define("FOO", "val"); definiraj ("FOO", res); // ne skalarji define("FOO", array(1)); // konstanta ni nastavljena in dobimo opozorilo define("FOO", (object) array(1)); // konstanta ni nastavljena in dobimo opozorilo

Od PHP 5.3

pojavil ključna beseda const in zdaj lahko z njim definiramo tudi konstanto.

Vendar ne morete podati spremenljivke, funkcije ali neke vrste izraza v const, ampak morate skalar posredovati "neposredno":

Const FOO = "val"; // ni napak const FOO = $var; // Napaka pri razčlenjevanju const FOO = home_url(); // Napaka pri razčlenjevanju const FOO = 5 + 10; // Napaka pri razčlenjevanju const FOO = "foo"."bar"; // Napaka pri razčlenjevanju

Medtem ko za define() ni takih omejitev ...

Definiraj ("FOO", "val"); // brez napak define("FOO", $var); // brez napak define("FOO", home_url()); // brez napak define("FOO", 5 + 10); // brez napak define("FOO", "foo"."bar"); // brez napak

PHP 5.6

Postalo je mogoče določiti primitivne izraze PHP (izraze iz skalarjev) kot vrednosti const:

Const FOO = 1 + 2; const FOO = "foo" . "bar";

Postalo je mogoče shraniti nize v konstantah:

Const FOO = ; // deluje definirano ("FOO", ); // ne deluje v PHP 5.6, deluje v PHP 7.0

Razlika med define() in const

#1 const je treba deklarirati v zgornjem obsegu

Za razliko od define() je treba const deklarirati na samem vrhu obsega, ker so definirani, ko je skript preveden. To pomeni, da jih ni mogoče deklarirati znotraj stavkov funkcij/zank/if ali blokov try/catch.

If (1) ( const NAME = "VALUE"; // ne deluje ) // ampak if (1) (define("NAME", "VALUE"); // deluje )

#2 const vedno razlikuje med velikimi in malimi črkami

const vedno razlikuje med velikimi in malimi črkami, medtem ko vam define() omogoča ustvarjanje konstant, ki ne razlikujejo med velikimi in malimi črkami:

Define("NAME", "VALUE", true); echo NAME; // VREDNOST ime odmeva; // VREDNOST

#3 const razume samo skalare

To velja le za PHP različice 5.6 in starejše ...

const ni mogoče posredovati spremenljivkam, funkcijam, izrazom, lahko pa je define():

Const FOO = $var; // Napaka pri razčlenjevanju const FOO = home_url(); // Napaka pri razčlenjevanju define("FOO", $var); // brez napak define("FOO", home_url()); // brez napak

#4 const lahko shranjuje nize od PHP 5.6 in definira od PHP 7.0

const FOO = ; // deluje v PHP 5.6 define("FOO", ); // ne deluje v PHP 5.6, deluje v PHP 7.0
Rezultati primerjave

Skoraj vedno je bolje definirati konstanto z uporabo define(), ker je več možnosti in manj možnosti za "ujetje" napake ... Izjema je, ko imate PHP 5.6 in morate shraniti matriko v konstanto, const bo tukaj pomagal.

Konstante razreda PHP

Razglašeni so samo z uporabo const. Pravila zanje so taka, kot je opisano zgoraj: sprejemajo le skalare, ne razumejo PHP spremenljivk, funkcij, izrazov ...

Konstante razreda so vedno javne - ni zasebnega ali zaščitenega statusa.

Deklarirana konstanta pripada posebej razredu, ne pripada nobenemu objektu in je skupna vsem objektom (primerkom) razreda.

Razred My_Class ( const NAME = "VALUE"; // od PHP 5.6 naprej lahko uporabljate matematične izraze const SEC_PER_DAY = 60 * 60 * 24; funkcija print_name() ( // dostop do konstante razreda znotraj metode prek self (samega razreda) ) echo self ::NAME; ) ) // dostop do konstante zunaj razreda // je mogoče poklicati iz globalnega obsega brez inicializacije primerka razreda echo My_Class::NAME;

Konstante razreda so zelo podobne lastnostim statičnega razreda.

Razred My_Class ( const NAME = "VALUE"; static $name = "VALUE";; ) echo My_Class::NAME; echo Moj_razred::$ime;

"Čarobne" konstante

In za zaključek, spomnimo se na posebne PHP konstante ...

PHP ima devet čarobnih konstant, ki spreminjajo svoj pomen glede na kontekst, v katerem se uporabljajo. Na primer, vrednost __LINE__ je odvisna od vrstice v skriptu, v kateri je podana ta konstanta. Vse "magične" konstante se razrešijo v času prevajanja, za razliko od običajnih konstant, ki se razrešijo med izvajanjem. Posebne konstante ne razlikujejo med velikimi in malimi črkami in so navedene spodaj:

Konstanta Opis
__LINE__ Trenutna številka vrstice v datoteki.
__MAPA__ Celotna pot in ime trenutne datoteke, v kateri se kliče konstanta.
__DIR__ PHP 5.3.0. Imenik datoteke, v kateri se uporablja konstanta. Enako kot dirname(__FILE__). Nima končne poševnice, razen v korenskem imeniku.
__FUNKCIJA__ Ime funkcije.
__RAZRED__ Ime razreda. To ime vsebuje ime imenskega prostora, v katerem je bil razred deklariran (na primer Foo\Bar). Deluje tudi v lastnostih. Ko se uporablja v metodah lastnosti, je to ime razreda, v katerem se te metode uporabljajo.
__LAST__ PHP 5.4.0. Ime lastnosti. To ime vsebuje ime imenskega prostora, v katerem je bila lastnost deklarirana (na primer Foo\Bar).
__METOD__ Ime metode razreda.
__NAMESPACE__ PHP 5.3.0. Ime trenutnega imenskega prostora.
Ime razreda :: razred PHP 5.5.0. Polno ime razreda (vključno z imenskim prostorom). Glejte tudi::class.