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:
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.0Rezultati 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. |