Παράκαμψη σταθερής PHP. Σταθερές στην PHP. Σε τι χρησιμεύουν οι σταθερές και δεν είναι ευκολότερο να χρησιμοποιηθούν οι μεταβλητές;

Σταθερές- πρόκειται για αξίες που δεν αλλάζουν με την πάροδο του χρόνου. Ακόμη και από το σχολείο, πιθανότατα γνωρίζετε πολλές σταθερές, για παράδειγμα, τον αριθμό Π, αριθμός μι, επιτάχυνση ελεύθερη πτώσηκαι άλλοι. Και, φυσικά, κατά τον προγραμματισμό, υπάρχει επίσης πολύ συχνά ανάγκη να μπείτε σταθερές. Και για το πώς δημιουργία και χρήση σταθερών στην PHP, θα μιλήσουμε για αυτό σε αυτό το άρθρο.

Πάμε μαζί σου ας δημιουργήσουμε μια σταθεράαριθμοί Π:

define(PI, 3.1415926);
ηχώ PI;
?>

Χειριστής καθορίζωδημιουργεί συνεχής ΠΙ.και του αποδίδει μια τιμή 3.1415926 . Στη συνέχεια εξάγουμε αυτή τη σταθερά μέσω του τελεστή ηχώ. Όλα είναι πολύ απλά, ωστόσο, υπάρχει μια σύσταση που σας συμβουλεύω να ακολουθείτε πάντα. Φροντίστε να γράψετε σταθερέςμε κεφαλαία γράμματα. Όχι ότι αυτό είναι απαραίτητο, αλλά πολύ επιθυμητό. Και αυτό συνηθίζεται όχι μόνο σε PHP, αλλά και σε άλλες γλώσσες.

Φυσικά, αργότερα αλλαγή σταθεράΤο PI δεν θα επιτρέπεται (γι' αυτό συνεχής).

Τώρα ας δούμε μια συνάρτηση που ελέγχει: " Ορίζεται η δεδομένη σταθερά;". Ας γράψουμε αυτό το σενάριο:

if (!defined("PI")) define(PI, 3.1415926);
ηχώ PI;
?>

Εδώ ελέγχεται η ύπαρξη σταθεράς ΠΙ.. Και αν δεν υπάρχει (δηλ συνάρτηση define().Επέστρεψαν ψευδής), τότε αρχικοποιούμε αυτήν τη σταθερά. Στη συνέχεια το εμφανίζουμε απλώς.

Όπως μπορείτε να δείτε, δημιουργήστε και χρησιμοποιήστε το δικό σας σταθερές στην PHP- είναι πολύ απλό.

Και τέλος, θα ήθελα να μιλήσω για ενσωματωμένες σταθερές PHP. Ας γράψουμε ένα απλό σενάριο:

phpinfo();
?>

Προς το τέλος υπάρχει ένα τμήμα " Μεταβλητή PHP«Στην πραγματικότητα, αυτό δεν είναι εντελώς σταθερέςωστόσο είναι σταθερέςκατά την εκτέλεση αυτού του σεναρίου. Φυσικά, όταν εκτελείται ένα άλλο σενάριο, θα έχουν διαφορετικές τιμές (όχι όλα, φυσικά). Ας σας βγάλουμε ζευγάρι σταθερές, για να καταλάβετε πώς να δουλέψετε μαζί τους, γιατί χρησιμοποιούνται απίστευτα συχνά:

echo $_SERVER["REMOTE_ADDR"];
ηχώ "
";
echo $_SERVER["QUERY_STRING"];
?>

Σε αυτό το σενάριο βγάζουμε Διεύθυνση IP χρήστη, το οποίο ξεκίνησε το σενάριο και στην επόμενη γραμμή εμφανίζουμε τη συμβολοσειρά ερωτήματος (για παράδειγμα, " index.php?id=7Κοιτώντας λίγο μπροστά, λέω ότι εδώ δουλεύουμε με το παγκόσμιο πίνακας $_SERVER. Θα γνωρίσουμε τους πίνακες αργότερα, αλλά νομίζω ότι όσοι έχουν δουλέψει με πίνακες σε άλλες γλώσσες προγραμματισμού θα αναγνωρίσουν τη σύνταξη χωρίς κανένα πρόβλημα. Όσο για τους άλλους σταθερές, τότε η δουλειά μαζί τους γίνεται με τον ίδιο τρόπο.

Για κάθε σενάριο που εκτελείται. Πολλές από αυτές τις σταθερές ορίζονται από διάφορες μονάδες και θα υπάρχουν μόνο εάν αυτές οι μονάδες είναι διαθέσιμες μέσω δυναμικής φόρτωσης ή μέσω στατικής συναρμολόγησης.

Υπάρχουν εννέα μαγικές σταθερές που αλλάζουν τη σημασία τους ανάλογα με το πλαίσιο στο οποίο χρησιμοποιούνται. Για παράδειγμα, η τιμή __ΓΡΑΜΜΗ__εξαρτάται από τη γραμμή του σεναρίου στην οποία καθορίζεται αυτή η σταθερά. Όλες οι μαγικές σταθερές επιλύονται κατά το χρόνο μεταγλώττισης, σε αντίθεση με τις κανονικές σταθερές, οι οποίες επιλύονται κατά το χρόνο εκτέλεσης. Οι ειδικές σταθερές δεν έχουν διάκριση πεζών-κεφαλαίων και παρατίθενται παρακάτω:

Μερικές μαγικές σταθερές PHP
Ονομα Περιγραφή
__ΓΡΑΜΜΗ__ Ο τρέχων αριθμός γραμμής στο αρχείο.
__ΑΡΧΕΙΟ__ Πλήρης διαδρομή και όνομα του τρέχοντος αρχείου με εκτεταμένους συμβολικούς συνδέσμους. Εάν χρησιμοποιείται μέσα σε ένα αρχείο που περιλαμβάνεται, το όνομα αυτού του αρχείου επιστρέφεται.
__DIR__ Κατάλογος αρχείων. Εάν χρησιμοποιείται μέσα σε ένα περιλαμβανόμενο αρχείο, ο κατάλογος αυτού του αρχείου επιστρέφεται. Αυτό ισοδυναμεί με κλήση dirname(__FILE__). Το όνομα καταλόγου που επιστρέφεται δεν τελειώνει με κάθετο, εκτός από τον ριζικό κατάλογο.
__ΛΕΙΤΟΥΡΓΙΑ__ Όνομα συνάρτησης ή (κλείσιμο)στην περίπτωση μιας ανώνυμης συνάρτησης.
__ΤΑΞΗ__ Ονομα τάξης. Αυτό το όνομα περιέχει το όνομα του χώρου ονομάτων στον οποίο δηλώθηκε η κλάση (για παράδειγμα, Foo\Bar). Λάβετε υπόψη ότι καθώς η PHP 5.4 __CLASS__ λειτουργεί επίσης σε χαρακτηριστικά. Όταν χρησιμοποιείται σε μεθόδους χαρακτηριστικών, __CLASS__ είναι το όνομα της κλάσης στην οποία χρησιμοποιούνται οι μέθοδοι.
__ΧΑΡΑΚΤΗΡΙΣΤΙΚΟ__ Όνομα χαρακτηριστικού. Αυτό το όνομα περιέχει τον χώρο ονομάτων στον οποίο δηλώθηκε το χαρακτηριστικό (για παράδειγμα, Foo\Bar).
__ΜΕΘΟΔΟΣ__ Το όνομα της μεθόδου κλάσης.
__NAMESPACE__ Το όνομα του τρέχοντος χώρου ονομάτων.
ClassName::class Πλήρες όνομακλάση (υποδεικνύει τον χώρο ονομάτων). Δείτε επίσης ::class.

δείτε επίσης get_class(), get_object_vars(), Το αρχείο υπάρχει()Και function_exists().

Λίστα αλλαγών

πριν 14 χρόνια

Η διαφορά μεταξύ
__FUNCTION__ και __METHOD__ όπως στην PHP 5.0.4 είναι αυτό

Η FUNCTION__ επιστρέφει μόνο το όνομα της συνάρτησης

ενώ ως __METHOD__ επιστρέφει το όνομα της κλάσης μαζί με το όνομα της συνάρτησης

ταξικό κόλπο
{
συνάρτηση doit()
{
echo __FUNCTION__;
}
συνάρτηση doitagain()
{
ηχώ __METHOD__;
}
}
$obj=νέο κόλπο();
$obj->doit();
η έξοδος θα είναι ---- doit
$obj->doitagain();
η έξοδος θα είναι ----- trick::doitagain

πριν 13 χρόνια

Η μαγική σταθερά __CLASS__ συμπληρώνει όμορφα τη συνάρτηση get_class().

Ωρες ωρες χρειάζεσαινα ξέρεις και τα δύο:
- όνομα της κλάσης που κληρονομήθηκε
- όνομα της κλάσης που εκτελέστηκε πραγματικά

Ακολουθεί ένα παράδειγμα που δείχνει την πιθανή λύση:

Τάξη βάση_κλάση
{
συνάρτηση say_a()
{

" ;
}

Συνάρτηση say_b()
{

" ;
}

Η class derived_class επεκτείνει την base_class
{
συνάρτηση say_a()
{
γονέας::say_a();
ηχώ ""α" - είπε το " . __ΤΑΞΗ__ . "
" ;
}

Συνάρτηση say_b()
{
γονέας::say_b();
ηχώ ""β" - είπε το " . get_class($this) . "
" ;
}
}

$obj_b = new derived_class();

$obj_b -> say_a();
ηχώ "
" ;
$obj_b -> say_b();

?>

Η έξοδος πρέπει να μοιάζει περίπου με αυτό:

"a" - είπε η base_class
"a" - είπε η παράγωγη_κλάση

"β" - είπε η παράγωγη_κλάση
"β" - είπε η παράγωγη_κλάση

Πριν από 3 χρόνια

Σημειώστε μια μικρή ασυνέπεια κατά τη χρήση των __CLASS__ και __METHOD__ σε χαρακτηριστικά (stand php 7.0.4): Ενώ η __CLASS__ λειτουργεί όπως διαφημίζεται και επιστρέφει δυναμικά το όνομα της κλάσης στην οποία χρησιμοποιείται το χαρακτηριστικό, ο __METHOD__ θα προσαρτήσει στην πραγματικότητα το όνομα του χαρακτηριστικού αντί για το όνομα τάξης!

πριν 8 χρόνια

Δεν υπάρχει τρόπος να εφαρμοστεί ένα συμβατό προς τα πίσω __DIR__ σε εκδόσεις πριν από την 5.3.0.

Το μόνο πράγμα που μπορείτε να κάνετε είναι να εκτελέσετε μια αναδρομική αναζήτηση και να αντικαταστήσετε το dirname(__FILE__):
εύρημα . -τύπος f -print0 | xargs -0 sed -i "s/__DIR__/dirname(__FILE__)/"

5 χρόνια πριν

Πολλές σημειώσεις εδώ αφορούν τον ορισμό της μαγικής σταθεράς __DIR__ για εκδόσεις PHP που δεν υποστηρίζουν τη δυνατότητα. Φυσικά, μπορείτε να ορίσετε αυτήν τη μαγική σταθερά για εκδόσεις PHP που δεν έχουν ακόμη αυτήν τη σταθερά, αλλά θα νικήσει το σκοπό της μόλις χρησιμοποιήσετε τη σταθερά σε ένα περιλαμβανόμενο αρχείο, το οποίο μπορεί να βρίσκεται σε διαφορετικό κατάλογο και μετά το αρχείο που ορίζει τη σταθερά __DIR__ . Ως εκ τούτου, η σταθερά έχει χάσει τη *μαγεία* της και θα ήταν μάλλον άχρηστη εκτός και αν βεβαιωθείτε ότι έχετε όλα τα περιεχόμενα στον ίδιο κατάλογο.

Συμπερασματικά: η σημείωση του gmail dot com σχετικά με το αν μπορείτε ή δεν μπορείτε να ορίσετε μαγικές σταθερές είναι έγκυρη, αλλά η δήλωση ότι ο ορισμός του __DIR__ δεν είναι άχρηστος, δεν είναι!

7 χρόνια πριν

Δεν μπορείτε να ελέγξετε εάν έχει οριστεί μια μαγική σταθερά. Αυτό σημαίνει ότι δεν έχει νόημα να ελέγξουμε αν έχει οριστεί το __DIR__ και μετά να το ορίσουμε. Το "defined("__DIR__")" επιστρέφει πάντα ψευδές. Ο ορισμός του __DIR__ θα αποτύχει σιωπηλά στην PHP 5.3+. Αυτό θα μπορούσε να προκαλέσει προβλήματα συμβατότητας εάν το σενάριό σας περιλαμβάνει άλλα σενάρια.

echo (defined ("__DIR__" ) ? "__DIR__ is defined" : "__DIR__ ΔΕΝ έχει οριστεί" . PHP_EOL );
echo (defined ("__FILE__" ) ? "__FILE__ is defined" : "__FILE__ ΔΕΝ έχει οριστεί" . PHP_EOL );
echo (καθορίζεται ("PHP_VERSION" ) ? "Η PHP_VERSION έχει οριστεί" : "Η PHP_VERSION ΔΕΝ έχει οριστεί") . PHP_EOL ;
echo "Έκδοση PHP: " . PHP_VERSION. PHP_EOL ;
?>
Παραγωγή:
Το __DIR__ ΔΕΝ ορίζεται
Το __FILE__ ΔΕΝ ορίζεται
PHP_VERSION έχει οριστεί
Έκδοση PHP: 5.3.6

Τελευταία ενημέρωση: 1/11/2015

Οι σταθερές, όπως και οι μεταβλητές, αποθηκεύουν μια συγκεκριμένη τιμή, αλλά σε αντίθεση με τις μεταβλητές, η τιμή των σταθερών μπορεί να οριστεί μόνο μία φορά και μετά δεν μπορούμε να την αλλάξουμε. Για παράδειγμα, ας ορίσουμε μια αριθμητική σταθερά:

Για να ορίσετε μια σταθερά, χρησιμοποιήστε τον τελεστή define, ο οποίος έχει την ακόλουθη μορφή: define(string $name, string $value, bool $case_sen=false) . Η παράμετρος $name μεταφέρει το όνομα της σταθεράς και η παράμετρος $value μεταφέρει την τιμή της. Η τρίτη προαιρετική παράμετρος παίρνει ένα boolean αληθήςή ψεύτικο. Εάν η τιμή είναι ψευδής, τότε όταν χρησιμοποιείται μια σταθερά θα λαμβάνεται υπόψη η περίπτωση της, ενώ εάν η τιμή είναι αληθής, η περίπτωση δεν θα λαμβάνεται υπόψη. Στην περίπτωσή μας, η τρίτη παράμετρος δεν χρησιμοποιείται, επομένως είναι false από προεπιλογή.

Αφού ορίσουμε μια σταθερά, μπορούμε να τη χρησιμοποιήσουμε ακριβώς όπως μια κανονική μεταβλητή. Η μόνη εξαίρεση είναι ότι δεν θα μπορέσουμε να αλλάξουμε την τιμή του. Μια άλλη διαφορά με μια μεταβλητή είναι ότι δεν χρειάζεται να χρησιμοποιήσετε το σύμβολο $. Δηλαδή η έκφραση ΑΡΙΘΜΟΣ=33; δεν θα λειτουργήσει.

Προκαθορισμένες σταθερές

Εκτός από τις σταθερές που δημιουργούνται από προγραμματιστές, η PHP έχει αρκετές ενσωματωμένες σταθερές:

    FILE__ : αποθηκεύει την πλήρη διαδρομή και το όνομα του τρέχοντος αρχείου

    LINE__ : αποθηκεύει τον τρέχοντα αριθμό γραμμής που επεξεργάζεται ο διερμηνέας

    DIR__: αποθηκεύει τον κατάλογο του τρέχοντος αρχείου

    FUNCTION__ : όνομα της συνάρτησης που υποβάλλεται σε επεξεργασία

    CLASS__ : όνομα της τρέχουσας τάξης

    ΜΕΘΟΔΟΣ__ : όνομα της μεθόδου που υποβάλλεται σε επεξεργασία

    NAMESPACE__ : όνομα του τρέχοντος χώρου ονομάτων

Για παράδειγμα, ας εκτυπώσουμε την τρέχουσα γραμμή που εκτελείται και το όνομα του αρχείου:

Έλεγχος ύπαρξης σταθεράς

Για να ελέγξουμε αν έχει οριστεί μια σταθερά, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση bool defined(string $name). Εάν οριστεί η σταθερά $name, η συνάρτηση θα επιστρέψει true

Μια σταθερά είναι ένα αναγνωριστικό (όνομα) για μια απλή τιμή. Όπως υποδηλώνει το όνομα, η τιμή τους δεν μπορεί να αλλάξει κατά την εκτέλεση του σεναρίου (εκτός από τις μαγικές σταθερές, οι οποίες στην πραγματικότητα δεν είναι σταθερές). Στα σταθερά ονόματα γίνεται διάκριση πεζών-κεφαλαίων από προεπιλογή. Κατά σύμβαση, τα ονόματα σταθερών γράφονται πάντα με κεφαλαία.

Το όνομα μιας σταθεράς πρέπει να ακολουθεί τις ίδιες συμβάσεις ονομασίας με άλλα ονόματα στην PHP. Ένα έγκυρο όνομα ξεκινά με ένα γράμμα ή μια υπογράμμιση ακολουθούμενη από οποιονδήποτε αριθμό γραμμάτων, αριθμών και υπογράμμισης. Κοινή έκφρασηγια να ελέγξετε την ορθότητα του ονόματος της σταθεράς μοιάζει με αυτό: ^*$

Είναι δυνατός ο ορισμός σταθερών χρησιμοποιώντας μια συνάρτηση καθορίζω()δεσμευμένα ή ακόμα και μη έγκυρα ονόματα των οποίων οι τιμές μπορούν (μόνο) να ληφθούν μέσω μιας συνάρτησης συνεχής(). Ωστόσο, αυτό δεν συνιστάται.

Παράδειγμα #1 Σωστά και λανθασμένα ονόματα σταθερών

// Διορθώστε τα ονόματα σταθερών
define ("FOO" , "κάτι" );
define ("FOO2" , "κάτι άλλο" );
define ("FOO_BAR" , "κάτι περισσότερο" );

// Λανθασμένα ονόματα σταθερών
define ("2FOO" , "κάτι" );

// Αυτή είναι μια έγκυρη δήλωση, αλλά είναι καλύτερα να μην τη χρησιμοποιήσετε:
// Η PHP μπορεί μια μέρα να καταχωρήσει μια μαγική σταθερά,
// που θα σπάσει το σενάριο
define ("__FOO__" , "κάτι" );

?>

Σχόλιο: Η έννοια των «γραμμάτων» είναι εδώ χαρακτήρες a-z, A-Z και άλλοι χαρακτήρες με κωδικούς ASCII από 128 έως 255 (0x80-0xff).

Πριν 2 χρόνια

Απόδοση σταθερών. PHP 7.1.10 32 bit (Opcache ενεργό, windows 10 i7-64bits) αλλά προφανώς οι τάσεις είναι ίδιες με το 5.x

χρησιμοποιώντας μια σταθερά που δηλώνεται από DEFINE("CNS",value) : 0.63575601577759s
χρησιμοποιώντας μια σταθερά που δηλώνεται από const CNS=value: 0,61372208595276s
χρησιμοποιώντας μια μεταβλητή που δηλώνεται από $v=value: 0.51184010505676s

Κατά μέσο όρο, η χρήση του DEFINE και του CONST είναι περίπου η ίδια με κάποια οπτικά καλύτερη απόδοση του CONST αντί του DEFINE. Ωστόσο, η χρήση μιας μεταβλητής είναι περίπου 10-50% καλύτερη από τη χρήση μιας σταθεράς. Έτσι, για μια εργασία με ένταση απόδοσης, η σταθερά δεν είναι η καλύτερη επιλογή.

$p1=microtime(true);
$x=0;
για($i=0;$i<50000000;$i++) {
$x+=CNS;
}
$p2=microtime(true);

πριν 14 χρόνια

Μια απροσδιόριστη σταθερά αξιολογείται ως αληθής όταν δεν χρησιμοποιείται σωστά. Πείτε για παράδειγμα ότι είχατε κάτι σαν αυτό:

ρυθμίσεις.php
// Λειτουργία εντοπισμού σφαλμάτων
define ("DEBUG" , false );
?>

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

εάν (ΕΝΤΟΠΙΣΗ ΣΦΑΛΜΑΤΩΝ) (
// ηχώ ορισμένα ευαίσθητα δεδομένα.
}
?>

Εάν για κάποιο λόγο το settings.php δεν συμπεριληφθεί και η σταθερά DEBUG δεν έχει οριστεί, η PHP θα εκτυπώσει ΑΚΟΜΑ τα ευαίσθητα δεδομένα. Η λύση είναι να τα αξιολογήσετε. Όπως:

ρυθμίσεις.php
// Λειτουργία εντοπισμού σφαλμάτων
define ("DEBUG" , 0 );
?>

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

αν (DEBUG == 1 ) (
// ηχώ ορισμένα ευαίσθητα δεδομένα.
}
?>

Τώρα λειτουργεί σωστά.

Σε αυτό το post θα καταλάβουμε ποια είναι η διαφορά διαφήμιση PHPσταθερές χρησιμοποιώντας τη λέξη-κλειδί const και τη συνάρτηση define().

Οι σταθερές στην PHP είναι "σταθερές" των οποίων οι τιμές καθορίζονται μόνο μία φορά και στη συνέχεια δεν μπορούν να αλλάξουν. Εάν προσπαθήσετε να αλλάξετε την τιμή, δεν θα αλλάξει και θα εμφανιστεί μια σημείωση PHP: "Σταθερά ήδη ορίζεται":

Define("FOO", "val"); define("FOO", "val2"); // Σημείωση: Σταθερή ήδη καθορισμένη ηχώ FOO. //> val

Υπάρχουν δύο τρόποι για να δηλώσετε σταθερές στην PHP:

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

Κάθε μέθοδος έχει τα δικά της χαρακτηριστικά, για να τα κατανοήσουμε, ας δούμε τα πάντα βήμα προς βήμα, πώς και τι άλλαξε με κάθε έκδοση της PHP.

Πώς να δημιουργήσετε σταθερές

PHP μικρότερη από 5.3

Πριν από το 5.3 στην PHP, οι σταθερές μπορούσαν να οριστούν μόνο χρησιμοποιώντας την define() . Η λέξη-κλειδί const εμφανίστηκε στην έκδοση 5.3.

Μόνο οι βαθμωτές μπορούν να αποθηκεύσουν σταθερές. Οι βαθμωτές μεταβλητές είναι μεταβλητές με τύπους ακέραιος, float, string και boolean. Οι τύποι πίνακα, αντικειμένων και πόρων δεν είναι βαθμωτοί.

// scalars define("FOO", 10); define("FOO", 10.9); define("FOO", "val"); define("FOO", true); // not scalar define("FOO", array(1)); // η σταθερά δεν έχει οριστεί και παίρνουμε Warning define("FOO", (object) array(1)); // η σταθερά δεν έχει οριστεί και λαμβάνουμε μια προειδοποίηση

Από την PHP 5.3

Εμφανίστηκε λέξη-κλειδί const και τώρα μπορεί επίσης να οριστεί μια σταθερά χρησιμοποιώντας το.

Ωστόσο, δεν μπορείτε να καθορίσετε μια μεταβλητή, μια συνάρτηση ή κάποιο είδος έκφρασης σε const, αλλά πρέπει να περάσετε το βαθμωτό "απευθείας":

Const FOO = "val"; // χωρίς σφάλματα const FOO = $var; // Σφάλμα ανάλυσης const FOO = home_url(); // Σφάλμα ανάλυσης const FOO = 5 + 10; // Σφάλμα ανάλυσης const FOO = "foo"."bar"; // Σφάλμα ανάλυσης

Ενώ για το define() δεν υπάρχουν τέτοιοι περιορισμοί...

Define("FOO", "val"); // no errors define("FOO", $var); // no errors define("FOO", home_url()); // no errors define("FOO", 5 + 10); // no errors define("FOO", "foo"."bar"); // χωρίς λάθη

PHP 5.6

Έχει καταστεί δυνατό να καθοριστούν πρωτόγονες εκφράσεις PHP (εκφράσεις από βαθμωτές) ως τιμές const:

Const FOO = 1 + 2; const FOO = "foo" . "μπαρ";

Έχει καταστεί δυνατή η αποθήκευση πινάκων σε σταθερές:

Const FOO = ; // works define("FOO", ); // δεν λειτουργεί σε PHP 5.6, λειτουργεί σε PHP 7.0

Διαφορά μεταξύ define() και const

Το #1 const πρέπει να δηλωθεί στο επάνω εύρος

Σε αντίθεση με την define(), το const πρέπει να δηλωθεί στην κορυφή του πεδίου εφαρμογής, επειδή ορίζονται κατά τη μεταγλώττιση του σεναρίου. Αυτό σημαίνει ότι δεν μπορούν να δηλωθούν μέσα σε δηλώσεις συναρτήσεων/βρόχων/if ή σε μπλοκ try/catch.

Αν (1) ( const NAME = "VALUE"; // δεν λειτουργεί ) // αλλά αν (1) ( define("NAME", "VALUE"); // λειτουργεί )

Το #2 const κάνει πάντα διάκριση πεζών-κεφαλαίων

Η const είναι πάντα διάκριση πεζών-κεφαλαίων, ενώ η define() σας επιτρέπει να δημιουργήσετε σταθερές χωρίς διάκριση πεζών-κεφαλαίων:

Define("NAME", "VALUE", true); ηχώ ΟΝΟΜΑ; // VALUE όνομα echo; // ΑΞΙΑ

Το #3 const καταλαβαίνει μόνο βαθμωτές

Αυτό ισχύει μόνο για τις εκδόσεις PHP 5.6 και νεότερες...

Το const δεν μπορεί να μεταβιβαστεί σε μεταβλητές, συναρτήσεις, εκφράσεις, αλλά η define() μπορεί να είναι:

Const FOO = $var; // Σφάλμα ανάλυσης const FOO = home_url(); // Σφάλμα ανάλυσης define("FOO", $var); // no errors define("FOO", home_url()); // χωρίς λάθη

Το #4 const μπορεί να αποθηκεύσει πίνακες από την PHP 5.6 και να καθορίσει από την PHP 7.0

const FOO = ; // λειτουργεί στην PHP 5.6 define("FOO", ); // δεν λειτουργεί σε PHP 5.6, λειτουργεί σε PHP 7.0
Αποτελέσματα σύγκρισης

Είναι σχεδόν πάντα καλύτερο να ορίσετε μια σταθερά χρησιμοποιώντας την define(), επειδή υπάρχουν περισσότερες δυνατότητες και λιγότερες επιλογές για να "πιάσετε" ένα σφάλμα... Η εξαίρεση είναι όταν έχετε PHP 5.6 και πρέπει να αποθηκεύσετε τον πίνακα σε μια σταθερά, const θα βοηθήσει εδώ.

Σταθερές κλάσης PHP

Δηλώνονται μόνο χρησιμοποιώντας const . Οι κανόνες για αυτούς είναι όπως περιγράφονται παραπάνω: δέχονται μόνο βαθμωτές, δεν κατανοούν μεταβλητές, συναρτήσεις, εκφράσεις PHP...

Οι σταθερές κλάσεων είναι πάντα δημόσιες - δεν υπάρχει ιδιωτική ή προστατευμένη κατάσταση.

Η δηλωμένη σταθερά ανήκει συγκεκριμένα στην κλάση, δεν ανήκει σε κανένα αντικείμενο και είναι κοινή σε όλα τα αντικείμενα (στιγμιότυπα) της κλάσης.

Κλάση My_Class ( const NAME = "VALUE"; // ξεκινώντας με την PHP 5.6, μπορείτε να χρησιμοποιήσετε μαθηματικές εκφράσεις const SEC_PER_DAY = 60 * 60 * 24; συνάρτηση print_name() ( // πρόσβαση σε μια σταθερά κλάσης μέσα σε μια μέθοδο μέσω self (η ίδια η κλάση ) echo self ::NAME; ) ) // η πρόσβαση σε μια σταθερά εκτός της κλάσης // μπορεί να κληθεί από το καθολικό εύρος χωρίς να αρχικοποιηθεί μια παρουσία κλάσης echo My_Class::NAME;

Οι σταθερές κλάσης είναι πολύ παρόμοιες με τις ιδιότητες στατικής κλάσης.

Κατηγορία My_Class ( const NAME = "VALUE"; static $name = "VALUE";; ) echo My_Class::NAME; echo My_Class::$name;

«Μαγικές» σταθερές

Και εν κατακλείδι, ας θυμηθούμε τις ειδικές σταθερές PHP...

Η PHP έχει εννέα μαγικές σταθερές που αλλάζουν τη σημασία τους ανάλογα με το πλαίσιο στο οποίο χρησιμοποιούνται. Για παράδειγμα, η τιμή του __LINE__ εξαρτάται από τη γραμμή του σεναρίου στην οποία καθορίζεται αυτή η σταθερά. Όλες οι "μαγικές" σταθερές επιλύονται κατά το χρόνο μεταγλώττισης, σε αντίθεση με τις κανονικές σταθερές, οι οποίες επιλύονται κατά το χρόνο εκτέλεσης. Οι ειδικές σταθερές δεν έχουν διάκριση πεζών-κεφαλαίων και παρατίθενται παρακάτω:

Συνεχής Περιγραφή
__ΓΡΑΜΜΗ__ Ο τρέχων αριθμός γραμμής στο αρχείο.
__ΑΡΧΕΙΟ__ Η πλήρης διαδρομή και το όνομα του τρέχοντος αρχείου στο οποίο καλείται η σταθερά.
__DIR__ PHP 5.3.0. Ο κατάλογος του αρχείου στον οποίο χρησιμοποιείται η σταθερά. Το ίδιο με το dirname(__FILE__) . Δεν έχει τελική κάθετο, εκτός από τον ριζικό κατάλογο.
__ΛΕΙΤΟΥΡΓΙΑ__ Όνομα συνάρτησης.
__ΤΑΞΗ__ Ονομα τάξης. Αυτό το όνομα περιέχει το όνομα του χώρου ονομάτων στον οποίο δηλώθηκε η κλάση (για παράδειγμα, Foo\Bar). Λειτουργεί επίσης σε χαρακτηριστικά. Όταν χρησιμοποιείται σε μεθόδους χαρακτηριστικών, αυτό είναι το όνομα της κλάσης στην οποία χρησιμοποιούνται αυτές οι μέθοδοι.
__ΧΑΡΑΚΤΗΡΙΣΤΙΚΟ__ PHP 5.4.0. Όνομα χαρακτηριστικού. Αυτό το όνομα περιέχει το όνομα του χώρου ονομάτων στον οποίο δηλώθηκε το χαρακτηριστικό (για παράδειγμα, Foo\Bar).
__ΜΕΘΟΔΟΣ__ Το όνομα της μεθόδου κλάσης.
__NAMESPACE__ PHP 5.3.0. Το όνομα του τρέχοντος χώρου ονομάτων.
ClassName::class PHP 5.5.0. Όνομα πλήρους τάξης (συμπεριλαμβανομένου του χώρου ονομάτων). Δείτε επίσης::class.