PHP konstantno nadjačavanje. Konstante u PHP-u. Čemu služe konstante i nije li lakše koristiti varijable?

Konstante- to su vrijednosti koje se ne mijenjaju tijekom vremena. Čak i iz škole vjerojatno znate mnoge konstante, na primjer, broj P, broj e, ubrzanje slobodan pad i drugi. I, naravno, kod programiranja također vrlo često postoji potreba za unosom konstante. I o tome kako stvarati i koristiti konstante u PHP-u, o tome ćemo govoriti u ovom članku.

Idemo s tobom stvorimo konstantu brojevima P:

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

Operater definirati stvara konstantno P.I. i dodjeljuje mu vrijednost 3.1415926 . Zatim ovu konstantu ispisujemo kroz operator jeka. Sve je vrlo jednostavno, međutim, postoji jedna preporuka koju vam savjetujem da uvijek slijedite. Obavezno napišite konstante velikim slovima. Nije da je to nužno, ali vrlo poželjno. I to je uobičajeno ne samo u PHP, ali i na drugim jezicima.

Naravno, kasnije promjena konstante PI neće biti dopušten (zato ona konstantno).

Sada pogledajmo jednu funkciju koja provjerava: " Je li navedena konstanta definirana?". Napišimo ovu skriptu:

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

Ovdje provjerava se postojanje konstante P.I.. A ako ne postoji (tj funkcija definiraj(). vratio se lažno), tada inicijaliziramo ovu konstantu. Zatim ga jednostavno prikažemo.

Kao što vidite, stvorite i koristite svoje konstante u PHP-u- vrlo je jednostavno.

I na kraju, želio bih razgovarati o ugrađene PHP konstante. Napišimo jednostavnu skriptu:

phpinfo();
?>

Pred kraj je dio " PHP varijabla“Zapravo, ovo nije u potpunosti konstante međutim, jesu konstante prilikom izvršavanja ove skripte. Naravno, kada se izvrši druga skripta, one će imati različite vrijednosti (ne sve, naravno). Hajdemo vas izvesti kao par konstante, tako da razumijete kako raditi s njima, jer se koriste nevjerojatno često:

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

U ovoj skripti ispisujemo IP adresa korisnika, koji je pokrenuo skriptu, au sljedećem retku prikazujemo niz upita (na primjer, " index.php?id=7"). Gledajući malo unaprijed, kažem da ovdje radimo s globalom niz $_SERVER. S nizovima ćemo se upoznati kasnije, ali mislim da će oni koji su radili s nizovima u drugim programskim jezicima bez problema prepoznati sintaksu. Što se tiče drugih konstante, tada se rad s njima događa na isti način.

Za svaku izvršenu skriptu. Mnoge od ovih konstanti definirane su različitim modulima i bit će prisutne samo ako su ti moduli dostupni kroz dinamičko učitavanje ili kroz statički sklop.

Postoji devet magičnih konstanti koje mijenjaju svoje značenje ovisno o kontekstu u kojem se koriste. Na primjer, vrijednost __CRTA__ ovisi o liniji u skripti na kojoj je navedena konstanta. Sve čarobne konstante se rješavaju tijekom kompajliranja, za razliku od običnih konstanti, koje se rješavaju tijekom izvođenja. Posebne konstante ne razlikuju velika i mala slova i navedene su u nastavku:

Neke čarobne PHP konstante
Ime Opis
__CRTA__ Trenutačni broj retka u datoteci.
__DATOTEKA__ Puni put i naziv trenutne datoteke s proširenim simboličkim vezama. Ako se koristi unutar uključene datoteke, vraća se naziv te datoteke.
__DIR__ Imenik datoteka. Ako se koristi unutar uključene datoteke, vraća se direktorij te datoteke. Ovo je jednako pozivu dirname(__FILE__). Vraćeni naziv direktorija ne završava kosom crtom, osim za korijenski direktorij.
__FUNKCIJA__ Naziv funkcije ili (zatvaranje) u slučaju anonimne funkcije.
__RAZRED__ Naziv klase. Ovo ime sadrži ime prostora imena u kojem je klasa deklarirana (na primjer, Foo\Bar). Imajte na umu da od PHP 5.4 __CLASS__ također radi u značajkama. Kada se koristi u metodama značajki, __CLASS__ je naziv klase u kojoj se metode koriste.
__OSOBINA__ Ime osobine. Ovo ime sadrži imenski prostor u kojem je osobina deklarirana (na primjer, Foo\Bar).
__METOD__ Naziv metode klase.
__NAMESPACE__ Naziv trenutnog imenskog prostora.
Ime klase:: klasa Puno ime klasa (ukazuje na imenski prostor). Vidi također ::class.

vidi također get_class(), get_object_vars(), dokument postoji() I funkcija_postoji().

Popis promjena

prije 14 godina

Razlika između
__FUNCTION__ i __METHOD__ kao u PHP 5.0.4 je to

FUNCTION__ vraća samo naziv funkcije

dok as __METHOD__ vraća naziv klase uz naziv funkcije

klasni trik
{
funkcija doit()
{
echo __FUNKCIJA__;
}
funkcija doitagain()
{
echo __METOD__;
}
}
$obj=novi trik();
$obj->doit();
izlaz će biti ---- doit
$obj->doitagin();
izlaz će biti ----- trick::doitagain

prije 13 godina

Magična konstanta __CLASS__ lijepo nadopunjuje funkciju get_class().

Ponekad trebaš znati oboje:
- naziv naslijeđene klase
- ime stvarno izvršene klase

Evo primjera koji pokazuje moguće rješenje:

Klasa osnovna_klasa
{
funkcija say_a()
{

" ;
}

Funkcija say_b()
{

" ;
}

klasa izvedena_klasa proširuje osnovnu_klasu
{
funkcija say_a()
{
roditelj::say_a();
echo ""a" - rekao je " . __RAZRED__ . "
" ;
}

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

$obj_b = nova izvedena_klasa();

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

?>

Izlaz bi otprilike trebao izgledati ovako:

"a" - rekla je osnovna_klasa
"a" - rekla je izvedena_klasa

"b" - rekla je izvedena_klasa
"b" - rekla je izvedena_klasa

prije 3 godine

Obratite pažnju na malu nedosljednost pri korištenju __CLASS__ i __METHOD__ u svojstvima (stanje php 7.0.4): dok __CLASS__ radi kao što je reklamirano i dinamički vraća naziv klase u kojoj se svojstvo koristi, __METHOD__ će zapravo dodati ime obilježja ispred imena umjesto naziv klase!

prije 8 godina

Ne postoji način za implementaciju __DIR__ kompatibilnog unatrag u verzijama prije 5.3.0.

Jedina stvar koju možete učiniti je izvršiti rekurzivno pretraživanje i zamijeniti u dirname(__FILE__):
pronaći . -tip f -ispis0 | xargs -0 sed -i "s/__DIR__/dirname(__FILE__)/"

prije 5 godina

Mnogo se napomena ovdje odnosi na definiranje magične konstante __DIR__ za PHP verzije koje ne podržavaju značajku. Naravno, možete definirati ovu čarobnu konstantu za verzije PHP-a koje još nemaju tu konstantu, ali ona će izgubiti svoju svrhu čim koristite konstantu u uključenoj datoteci, koja može biti u drugom direktoriju od datoteke koja definira konstantu __DIR__ . Kao takva, konstanta je izgubila svoju *magiju* i bila bi prilično beskorisna osim ako se ne uvjerite da su svi vaši dodaci u istom direktoriju.

Zaključak: napomena gmail dot com o tome možete li ili ne možete definirati čarobne konstante je valjana, ali izjava da definiranje __DIR__ nije beskorisno, nije!

prije 7 godina

Ne možete provjeriti je li definirana čarobna konstanta. To znači da nema smisla provjeravati je li __DIR__ definiran i zatim ga definirati. `defined("__DIR__")` uvijek vraća false. Definiranje __DIR__ tiho neće uspjeti u PHP-u 5.3+. To može uzrokovati probleme s kompatibilnošću ako vaša skripta uključuje druge skripte.

echo (definirano ("__DIR__" ) ? "__DIR__ je definirano" : "__DIR__ NIJE definirano" . PHP_EOL );
echo (definirano ("__FILE__" ) ? "__FILE__ je definirano" : "__DATOTEKA__ NIJE definirano" . PHP_EOL );
echo (definirano ("PHP_VERSION" ) ? "PHP_VERSION je definirano" : "PHP_VERSION NIJE definirano" ) . PHP_EOL ;
echo "PHP verzija: " . PHP_VERZIJA. PHP_EOL ;
?>
Izlaz:
__DIR__ NIJE definiran
__FILE__ NIJE definiran
PHP_VERSION je definiran
PHP verzija: 5.3.6

Zadnja izmjena: 1.11.2015

Konstante, kao i varijable, pohranjuju određenu vrijednost, ali za razliku od varijabli, vrijednost konstanti možemo postaviti samo jednom, a zatim je ne možemo mijenjati. Na primjer, definirajmo numeričku konstantu:

Za definiranje konstante upotrijebite operator define koji ima sljedeći oblik: define(string $name, string $value, bool $case_sen=false) . Parametar $name prenosi naziv konstante, a parametar $value prenosi njezinu vrijednost. Treći izborni parametar uzima Booleovu vrijednost pravi ili lažno. Ako je vrijednost lažna, tada će se pri korištenju konstante uzeti u obzir velika i mala slova; ako je istinita, velika i mala slova neće biti uzeta u obzir. U našem slučaju, treći parametar se ne koristi, pa je prema zadanim postavkama false.

Nakon definiranja konstante, možemo je koristiti kao običnu varijablu. Jedina iznimka je da nećemo moći promijeniti njegovu vrijednost. Još jedna razlika s varijablama je da ne morate koristiti znak $. Odnosno, izraz BROJ=33; neće raditi.

Predefinirane konstante

Osim konstanti koje je izradio programer, PHP ima nekoliko ugrađenih konstanti:

    FILE__ : pohranjuje puni put i naziv trenutne datoteke

    LINE__ : pohranjuje trenutni broj retka koji tumač obrađuje

    DIR__: pohranjuje direktorij trenutne datoteke

    FUNCTION__ : naziv funkcije koja se obrađuje

    CLASS__ : naziv trenutne klase

    METHOD__ : naziv metode koja se obrađuje

    NAMESPACE__ : ime trenutnog imenskog prostora

Na primjer, ispišite trenutni redak koji se izvršava i naziv datoteke:

Provjera postojanja konstante

Kako bismo provjerili je li konstanta definirana, možemo koristiti funkciju bool defined(string $name). Ako je definirana konstanta $name, funkcija će vratiti true

Konstanta je identifikator (ime) za jednostavnu vrijednost. Kao što ime sugerira, njihova se vrijednost ne može mijenjati tijekom izvođenja skripte (osim magičnih konstanti, koje zapravo nisu konstante). Imena konstanti su prema zadanim postavkama osjetljiva na velika i mala slova. Prema konvenciji, imena konstanti uvijek se pišu velikim slovima.

Ime konstante mora slijediti iste konvencije imenovanja kao i druga imena u PHP-u. Valjano ime počinje slovom ili podvlakom nakon koje slijedi bilo koji broj slova, brojeva i podvlaka. Uobičajeni izraz za provjeru ispravnosti imena konstante izgleda ovako: ^*$

Konstante je moguće definirati pomoću funkcije definirati() rezervirana ili čak nevažeća imena čije se vrijednosti mogu (samo) dobiti preko funkcije konstantno(). Međutim, to se ne preporučuje.

Primjer #1 Točna i netočna imena konstanti

// Ispravite imena konstanti
definirati ("FOO", "nešto");
definirati ("FOO2", "nešto drugo");
define ("FOO_BAR" , "još nešto" );

// Neispravna imena konstanti
definiraj ("2FOO", "nešto");

// Ovo je važeća deklaracija, ali je bolje ne koristiti je:
// PHP bi jednog dana mogao registrirati magičnu konstantu,
// što će pokvariti skriptu
definiraj ("__FOO__", "nešto");

?>

Komentar: Koncept "slova" ovdje je znakovi a-z, A-Z i drugi znakovi s ASCII kodovima od 128 do 255 (0x80-0xff).

Prije 2 godine

Performanse konstanti. PHP 7.1.10 32 bita (Opcache aktivan, Windows 10 i7-64 bita), ali očito su trendovi isti s 5.x

koristeći konstantu deklariranu pomoću DEFINE("CNS",vrijednost): 0,63575601577759s
koristeći konstantu koju je deklarirao const CNS=vrijednost: 0,61372208595276s
koristeći varijablu koju je deklarirao $v=vrijednost: 0.51184010505676s

U prosjeku, upotreba DEFINE i CONST je otprilike ista s nešto boljim performansama CONST umjesto DEFINE. Međutim, korištenje varijable je oko 10-50% bolje nego korištenje konstante. Dakle, za zadatak koji zahtijeva intenzivnu izvedbu, konstanta nije najbolja opcija.

$p1=mikrovrijeme(istina);
$x=0;
za ($i=0;$i<50000000;$i++) {
$x+=CNS;
}
$p2=mikrovrijeme(istina);

prije 14 godina

Nedefinirana konstanta procjenjuje se kao istinita kada se ne koristi ispravno. Recimo da ste imali nešto poput ovoga:

postavke.php
// Način otklanjanja pogrešaka
definirati ("DEBUG", false);
?>

test.php
uključi("postavke.php" );

ako (DEBUG) (
// odjek nekih osjetljivih podataka.
}
?>

Ako se iz nekog razloga settings.php ne uključi i konstanta DEBUG nije postavljena, PHP će IPAK ispisati osjetljive podatke. Rješenje je da ih procijenite. Na primjer:

postavke.php
// Način otklanjanja pogrešaka
definirati ("DEBUG", 0);
?>

test.php
uključi("postavke.php" );

if (DEBUG == 1 ) (
// odjek nekih osjetljivih podataka.
}
?>

Sada radi ispravno.

U ovom postu ćemo otkriti u čemu je razlika PHP oglas konstante pomoću ključne riječi const i funkcije define().

Konstante u PHP-u su “konstante” čije su vrijednosti navedene samo jednom i nakon toga se ne mogu mijenjati. Ako pokušate promijeniti vrijednost, ona se neće promijeniti i pojavit će se PHP bilješka: “Konstanta je već definirana”:

Definiraj ("FOO", "val"); definiraj("FOO", "val2"); // Napomena: Konstanta već definirana echo FOO; //> val

Postoje dva načina za deklariranje konstanti u PHP-u:

// 1 definiraj("IME", "VRIJEDNOST"); // 2 const NAME = "VRIJEDNOST";

Svaka metoda ima svoje karakteristike, da bismo ih razumjeli, pogledajmo sve korak po korak, kako i što se promijenilo sa svakom verzijom PHP-a.

Kako stvoriti konstante

PHP manji od 5.3

Prije 5.3 u PHP-u, konstante su se mogle definirati samo pomoću define(). Ključna riječ const pojavila se u verziji 5.3.

Samo skalari mogu pohranjivati ​​konstante. Skalarne varijable su varijable s tipovima integer, float, string i boolean. Tipovi polja, objekta i resursa nisu skalarni.

// skalari define("FOO", 10); definiraj("FOO", 10.9); definiraj("FOO", "val"); definiraj("FOO", istina); // ne skalari define("FOO", array(1)); // konstanta nije postavljena i dobivamo Upozorenje define("FOO", (object) array(1)); // konstanta nije postavljena i dobivamo Upozorenje

Od PHP 5.3

Pojavio se ključna riječ const i sada se pomoću njega može definirati i konstanta.

Međutim, ne možete navesti varijablu, funkciju ili neku vrstu izraza u const, ali morate proslijediti skalar "izravno":

Const FOO = "val"; // nema grešaka const FOO = $var; // Pogreška analize const FOO = home_url(); // Pogreška raščlanjivanja const FOO = 5 + 10; // Pogreška analize const FOO = "foo"."bar"; // Pogreška analize

Dok za define() nema takvih ograničenja...

Definiraj ("FOO", "val"); // nema grešaka define("FOO", $var); // nema grešaka define("FOO", home_url()); // nema grešaka define("FOO", 5 + 10); // nema grešaka define("FOO", "foo"."bar"); // nema grešaka

PHP 5.6

Postalo je moguće navesti primitivne PHP izraze (izraze iz skalara) kao konstantne vrijednosti:

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

Postalo je moguće pohranjivati ​​nizove u konstantama:

Const FOO = ; // works define("FOO", ); // ne radi u PHP 5.6, radi u PHP 7.0

Razlika između define() i const

#1 const mora biti deklariran u gornjem opsegu

Za razliku od define(), const se mora deklarirati na samom vrhu opsega jer se definiraju kada se skripta kompajlira. To znači da se ne mogu deklarirati unutar naredbi funkcija/petlji/if ili blokova try/catch.

If (1) ( const NAME = "VALUE"; // ne radi ) // ali if (1) (define("NAME", "VALUE"); // radi )

#2 const uvijek razlikuje velika i mala slova

const uvijek razlikuje velika i mala slova, dok vam define() omogućuje da napravite konstante koje nisu osjetljive na velika i mala slova:

Definiraj("IME", "VRIJEDNOST", istina); echo IME; // VRIJEDNOST echo name; // VRIJEDNOST

#3 const razumije samo skalare

Ovo vrijedi samo za PHP verzije 5.6 i niže...

const se ne može proslijediti varijablama, funkcijama, izrazima, ali define() može biti:

Const FOO = $var; // Pogreška analize const FOO = home_url(); // Pogreška analize define("FOO", $var); // nema grešaka define("FOO", home_url()); // nema grešaka

#4 const može pohranjivati ​​nizove od PHP 5.6 i definirati od PHP 7.0

const FOO = ; // radi u PHP 5.6 define("FOO", ); // ne radi u PHP 5.6, radi u PHP 7.0
Rezultati usporedbe

Skoro uvijek je bolje definirati konstantu pomoću define() , jer postoji više mogućnosti i manje opcija za “hvatanje” greške... Izuzetak je kada imate PHP 5.6 i trebate spremiti niz u konstantu, const će pomoći ovdje.

PHP konstante klase

Deklariraju se samo korištenjem const. Pravila za njih su gore opisana: prihvaćaju samo skalare, ne razumiju PHP varijable, funkcije, izraze...

Konstante klase uvijek su javne - nema privatnog ili zaštićenog statusa.

Deklarirana konstanta pripada konkretno klasi, ne pripada nijednom objektu i zajednička je svim objektima (instancama) klase.

Klasa My_Class ( const NAME = "VALUE"; // počevši od PHP-a 5.6 možete koristiti matematičke izraze const SEC_PER_DAY = 60 * 60 * 24; funkcija print_name() ( // pristup konstanti klase unutar metode putem self (sama klasa) ) echo self ::NAME; ) ) // pristup konstanti izvan klase // može se pozvati iz globalnog opsega bez inicijalizacije instance klase echo My_Class::NAME;

Konstante klase vrlo su slične svojstvima statičke klase.

Klasa My_Class ( const NAME = "VALUE"; static $name = "VALUE";; ) echo My_Class::NAME; echo Moja_klasa::$ime;

"Magične" konstante

I na kraju, prisjetimo se posebnih PHP konstanti...

PHP ima devet čarobnih konstanti koje mijenjaju svoje značenje ovisno o kontekstu u kojem se koriste. Na primjer, vrijednost __LINE__ ovisi o retku u skripti u kojem je navedena konstanta. Sve "čarobne" konstante se rješavaju tijekom kompajliranja, za razliku od regularnih konstanti, koje se rješavaju tijekom izvođenja. Posebne konstante ne razlikuju velika i mala slova i navedene su u nastavku:

Konstantno Opis
__CRTA__ Trenutačni broj retka u datoteci.
__DATOTEKA__ Puni put i naziv trenutne datoteke u kojoj se poziva konstanta.
__DIR__ PHP 5.3.0. Direktorij datoteke u kojoj se koristi konstanta. Isto kao dirname(__FILE__) . Nema kose crte na kraju, osim u korijenskom direktoriju.
__FUNKCIJA__ Naziv funkcije.
__RAZRED__ Naziv klase. Ovo ime sadrži ime imenskog prostora u kojem je klasa deklarirana (na primjer, Foo\Bar). Djeluje i na osobine. Kada se koristi u metodama značajki, ovo je naziv klase u kojoj se te metode koriste.
__OSOBINA__ PHP 5.4.0. Ime osobine. Ovo ime sadrži ime prostora imena u kojem je obilježje deklarirano (na primjer, Foo\Bar).
__METOD__ Naziv metode klase.
__NAMESPACE__ PHP 5.3.0. Naziv trenutnog imenskog prostora.
Ime klase:: klasa PHP 5.5.0. Puni naziv klase (uključujući prostor imena). Također pogledajte::class.