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

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

Μερικές μαγικές σταθερές 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().

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

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

class base_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.

Το μόνο πράγμα που μπορείς do είναι να εκτελέσετε μια αναδρομική αναζήτηση και να αντικαταστήσετε το 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 5 >= 5.3.0, PHP 7)

Αυτή η λίστα ερωτήσεων χωρίζεται σε δύο μέρη: γενικές ερωτήσεις και ορισμένες λεπτομέρειες εφαρμογής που είναι χρήσιμες για μια πληρέστερη κατανόηση.

Πρώτον, γενικές ερωτήσεις.

  1. Εάν δεν χρησιμοποιώ χώρους ονομάτων, θα πρέπει κάτι από αυτά να θεωρηθεί σημαντικό;
  2. Πώς μπορώ να χρησιμοποιήσω εσωτερικές ή καθολικές κλάσεις σε έναν χώρο ονομάτων;
  3. Πώς μπορώ να χρησιμοποιήσω συναρτήσεις κλάσης σε χώρους ονομάτων ή σταθερές στο δικό τους χώρο ονομάτων;
  4. Πώς είναι ένα όνομα \το όνομά μουή \όνομαέχει μετατραπεί?
  5. Σαν όνομα σαν το όνομά μουέχει μετατραπεί?
  6. Ως όνομα κλάσης χωρίς επιφύλαξη, όπως όνομαέχει μετατραπεί?
  7. Ως όνομα συνάρτησης χωρίς περιορισμούς ή όνομα σταθερού χωρίς περιορισμούς, όπως π.χ όνομαέχει μετατραπεί?

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

  1. Τα εισαγόμενα ονόματα δεν μπορούν να έρθουν σε διένεξη με κλάσεις που ορίζονται στο ίδιο αρχείο.
  2. Ούτε συναρτήσεις ούτε σταθερές μπορούν να εισαχθούν χρησιμοποιώντας τη δήλωση χρήση.
  3. Τα ονόματα δυναμικών χώρων ονομάτων (τα αναγνωριστικά εσωκλείονται σε εισαγωγικά) πρέπει να διαφεύγουν από τον χαρακτήρα ανάστροφης κάθετου.
  4. Δεν μπορείτε να αναφερθείτε σε μη καθορισμένες σταθερές χρησιμοποιώντας ανάστροφη κάθετο. Γίνεται μοιραίο λάθος
  5. Δεν είναι δυνατή η παράκαμψη ειδικών σταθερών όπως NULL, TRUE, FALSE, ZEND_THREAD_SAFE ή ZEND_DEBUG_BUILD

Εάν δεν χρησιμοποιώ χώρους ονομάτων, θα πρέπει κάτι από αυτά να θεωρηθεί σημαντικό;

Οχι. Οι χώροι ονομάτων δεν έχουν καμία επίδραση σε οποιονδήποτε υπάρχοντα κώδικα σε οποιαδήποτε μορφή ή σε οποιονδήποτε γραπτό κώδικα που δεν περιέχει χώρους ονομάτων. Μπορείτε να γράψετε κώδικα όπως αυτός αν θέλετε:

Beispiel #1 Πρόσβαση σε καθολικές κλάσεις εκτός χώρου ονομάτων

$a = new \ stdClass ;
?>

Αυτό είναι λειτουργικά ισοδύναμο με το ακόλουθο:

Beispiel #2 Πρόσβαση σε καθολικές τάξεις εκτός χώρου ονομάτων

$a = νέα stdClass ;
?>

Πώς μπορώ να χρησιμοποιήσω εσωτερικές ή καθολικές κλάσεις σε έναν χώρο ονομάτων;

Beispiel #3 Πρόσβαση σε εσωτερικές τάξεις σε χώρους ονομάτων

namespace foo ;
$a = new \ stdClass ;

δοκιμή συνάρτησης(\ArrayObject $typehintexample = null )()

$a = \ DirectoryIterator :: CURRENT_AS_FILEINFO ;

// επέκταση μιας εσωτερικής ή παγκόσμιας κλάσης
κλάση MyException extends\Exception()
?>

Πώς μπορώ να χρησιμοποιήσω συναρτήσεις κλάσης σε χώρους ονομάτων ή σταθερές στον δικό τους χώρο ονομάτων;

Beispiel #4 Πρόσβαση σε εσωτερικές κλάσεις, συναρτήσεις ή σταθερές σε χώρους ονομάτων

namespace foo ;

classMyClass()

// χρησιμοποιώντας μια κλάση από τον τρέχοντα χώρο ονομάτων
δοκιμή συνάρτησης (MyClass $typehintexample = null ) ()
// άλλος τρόπος χρήσης μιας κλάσης από τον τρέχοντα χώρο ονομάτων
δοκιμή συνάρτησης(\foo\MyClass $typehintexample = null )()

// επέκταση κλάσης από τον τρέχοντα χώρο ονομάτων
Η κλάση Extended επεκτείνει το MyClass()

// πρόσβαση στην καθολική λειτουργία
$a = \globalfunc();

// πρόσβαση στην καθολική σταθερά
$b = \ INI_ALL ;
?>

Πώς είναι ένα όνομα \το όνομά μουή \όνομαέχει μετατραπεί?

Ονόματα που ξεκινούν με \ μετατρέπονται πάντα σε αυτό που μοιάζουν, δηλ. \το όνομά μου- στην πραγματικότητα είναι το όνομά μου, και \Εξαίρεση- αυτό είναι Εξαίρεση.

Παράδειγμα #5 Απόλυτα ονόματα

namespace foo ;
$a = new\my\name(); // δημιουργεί μια παρουσία της κλάσης "my\name"
echo \strlen("γεια"); // καλεί τη συνάρτηση "strlen".
$a = \ INI_ALL ; // στη μεταβλητή $a εκχωρείται η τιμή της σταθεράς "INI_ALL"
?>

Σαν όνομα σαν το όνομά μουέχει μετατραπεί?

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

μουάλλο όνομα, τότε αυτό το συνώνυμο ισχύει μουσε το όνομά μου.

το όνομά μου.

Παράδειγμα #6 Ολόκληρα ονόματα

namespace foo ;
χρησιμοποιήστε μπλα \ μπλα ως foo ;

$a = νέο my\name(); // δημιουργεί μια παρουσία της κλάσης "foo\my\name"
foo\bar::name(); // καλεί τη στατική μέθοδο "name" στην κλάση "blah\blah\bar"
my\bar(); // καλεί τη συνάρτηση "foo\my\bar"
$a = my\ BAR ; // εκχωρεί στη μεταβλητή $a την τιμή της σταθεράς "foo\my\BAR"
?>

Ως όνομα κλάσης χωρίς επιφύλαξη, όπως όνομαέχει μετατραπεί?

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

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

Διαφορετικά, το τρέχον όνομα χώρου ονομάτων γίνεται πρόθεμα σε το όνομά μου.

Παράδειγμα #7 Ακατάλληλα ονόματα κλάσεων

namespace foo ;
χρησιμοποιήστε μπλα \ μπλα ως foo ;

$a = newname(); // δημιουργεί μια παρουσία της κλάσης "foo\name"
foo::name(); // καλεί τη στατική μέθοδο "name" στην κλάση "blah\blah"
?>

Ως όνομα συνάρτησης χωρίς περιορισμούς ή όνομα σταθερού χωρίς περιορισμούς, όπως π.χ όνομαέχει μετατραπεί?

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

Πρώτον, το τρέχον όνομα χώρου ονομάτων γίνεται πρόθεμα σε όνομα.

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

Παράδειγμα #8 Ακατάλληλα ονόματα συναρτήσεων ή σταθερών

namespace foo ;
χρησιμοποιήστε μπλα \ μπλα ως foo ;

const FOO = 1 ;

συνάρτηση my()()
functionfoo()()
ταξινόμηση συνάρτησης (& $a)
{
\sort($a); // καλεί την καθολική συνάρτηση "ταξινόμηση"
$a = array_flip($a);
επιστροφή $a ;
}

μου(); // καλεί "foo\my"
$a = strlen("γεια"); // καλεί την καθολική συνάρτηση "strlen" επειδή το "foo\strlen" δεν υπάρχει
$arr = πίνακας(1 , 3 , 2 );
$b = sort($arr); // καλεί τη συνάρτηση "foo\ sort".
$c = foo(); // καλεί τη συνάρτηση "foo\foo" - δεν εφαρμόζονται εισαγωγές

$a = FOO ; Το // ορίζει τη μεταβλητή $a στην τιμή της σταθεράς "foo\FOO" - δεν εφαρμόζονται εισαγωγές
$b = INI_ALL ; // εκχωρεί την τιμή της καθολικής σταθεράς "INI_ALL" στη μεταβλητή $b
?>

Τα εισαγόμενα ονόματα δεν μπορούν να έρθουν σε διένεξη με κλάσεις που ορίζονται στο ίδιο αρχείο.

Επιτρέπονται οι ακόλουθοι συνδυασμοί σεναρίων:

namespace my \ stuff ;
classMyClass()
?>

namespace άλλο ?
classthing()
?>

namespace my \ stuff ;
περιλαμβάνει "file1.php" ;
συμπεριλάβετε "another.php" ;


$a = νέα MyClass ; // δημιουργεί μια παρουσία της κλάσης "thing" από τον χώρο ονομάτων "another"
?>

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

namespace my \ stuff ;
χρησιμοποιήστε ένα άλλο \ πράγμα ως MyClass.
classMyClass() // μοιραίο σφάλμα: Το MyClass έρχεται σε διένεξη με μια δήλωση εισαγωγής
$a = νέα MyClass ;
?>

Δεν επιτρέπονται οι ένθετοι χώροι ονομάτων.

Η PHP δεν επιτρέπει την ένθεση χώρων ονομάτων.

χώρος ονομάτων my\stuff(
ένθετος χώρος ονομάτων (
classfoo()
}
}
?>

Ωστόσο, προσομοιώστε ένθετους χώρους ονομάτων όπως:

χώρος ονομάτων my\stuff\nested(
classfoo()
}
?>

Πριν από την PHP 5.6, ούτε συναρτήσεις ούτε σταθερές μπορούσαν να εισαχθούν χρησιμοποιώντας το χρήση.

Πριν από την PHP 5.6, τα μόνα στοιχεία που επηρεάζονται από τον τελεστή χρήσηείναι χώροι ονομάτων και ονόματα κλάσεων. Για να συντομεύσετε μεγάλα ονόματα σταθερών ή συναρτήσεων, εισαγάγετε τα περιεχόμενά τους στον χώρο ονομάτων.

ορυχείο ονομάτων ;
χρήση ultra\long\ns\name ;

$a = όνομα \ CONSTANT ;
name\func();
?>

Από την PHP 5.6, ήταν δυνατή η εισαγωγή και η δημιουργία ψευδωνύμων για συναρτήσεις και ονόματα σταθερών.

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

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

Παράδειγμα #9 Παγίδες κατά τη χρήση ενός ονόματος χώρου ονομάτων μέσα σε μια συμβολοσειρά με διπλά εισαγωγικά

$a = " επικίνδυνο\όνομα " ; // \n είναι μια νέα γραμμή μέσα σε μια συμβολοσειρά με διπλά εισαγωγικά!
$obj = νέο $a ;

$a = "δεν\καθόλου\επικίνδυνο" ; // και δεν υπάρχει πρόβλημα.
$obj = νέο $a ;
?>

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

Δεν μπορείτε να αναφερθείτε σε μη καθορισμένες σταθερές χρησιμοποιώντας ανάστροφη κάθετο. Γίνεται μοιραίο λάθος

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

Παράδειγμα #10 Μη καθορισμένες σταθερές

γραμμή ονομάτων ;
$a = FOO ; // εκτυπώνει μια προειδοποίηση: απροσδιόριστες σταθερές "FOO" υποτίθεται "FOO";
$a = \FOO ; // μοιραίο σφάλμα: απροσδιόριστος χώρος ονομάτων σταθερά FOO
$a = Bar\FOO ; // μοιραίο σφάλμα: απροσδιόριστος χώρος ονομάτων σταθερή γραμμή\Bar\FOO
$a = \Bar\FOO ; // μοιραίο σφάλμα: απροσδιόριστος χώρος ονομάτων σταθερά Bar\FOO
?>

Δεν είναι δυνατή η παράκαμψη ειδικών σταθερών όπως NULL, TRUE, FALSE, ZEND_THREAD_SAFE ή ZEND_DEBUG_BUILD

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

Παράδειγμα #11 Μη καθορισμένες σταθερές

γραμμή ονομάτων ;
const NULL = 0 ; // Μοιραίο σφάλμα;
const true = "ηλίθιος" ; // επίσης μοιραίο σφάλμα.
// και τα λοιπά.
?>

7 χρόνια πριν

Υπάρχει ένας τρόπος να ορίσετε μια σταθερά χώρου ονομάτων που είναι μια ειδική, ενσωματωμένη σταθερά, χρησιμοποιώντας τη συνάρτηση ορισμού και τη ρύθμιση η τρίτηπαράμετρος case_insensitive to false:

namespace foo ;
ορίζει (__NAMESPACE__ . "\NULL" , 10 ); // ορίζει τη σταθερά NULL στον τρέχοντα χώρο ονομάτων


?>

Δεν χρειάζεται να καθορίσετε τον χώρο ονομάτων στην κλήση σας για να ορίσετε(), όπως συμβαίνει συνήθως
namespace foo ;
define(INI_ALL , "bar" ); // παράγει ειδοποίηση - Η σταθερά INI_ALL έχει ήδη οριστεί. Αλλά:

Ορισμός (__NAMESPACE__ . "\INI_ALL" , "bar" ); // ορίζει τη σταθερά INI_ALL στον τρέχοντα χώρο ονομάτων
var_dump(INI_ALL); // θα εμφανίσει το string(3)"bar". Τίποτα απαρατήρητο μέχρι στιγμής. Αλλά:

Define("NULL" , 10 ); // ορίζει τη σταθερά NULL στον τρέχοντα χώρο ονομάτων...
var_dump(NULL); // θα δείξει 10
var_dump(null); // θα εμφανίσει NULL
?>

Εάν η παράμετρος case_insensitive οριστεί σε true
namespace foo ;
define (__NAMESPACE__ . "\NULL" , 10 , true ); // παράγει ειδοποίηση - Το σταθερό μηδενικό έχει ήδη οριστεί
?>

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

Όταν δημιουργείτε κλάσεις ή καλείτε στατικές μεθόδους μέσα από χώρους ονομάτων χρησιμοποιώντας μεταβλητές, πρέπει να έχετε κατά νου ότι απαιτούν τον πλήρη χώρο ονομάτων προκειμένου να χρησιμοποιηθεί η κατάλληλη κλάση. ΔΕΝ ΜΠΟΡΕΙΤΕ να χρησιμοποιήσετε ψευδώνυμο ή σύντομο όνομα, ακόμα κι αν καλείται στον ίδιο χώρο ονομάτων. Αν παραλείψετε να λάβετε αυτό υπόψη, ο κώδικάς σας μπορεί να χρησιμοποιήσει λάθος κλάση, να δημιουργήσει μια μοιραία εξαίρεση κλάσης που λείπει ή να προκαλέσει σφάλματα ή προειδοποιήσεις.

Σε αυτές τις περιπτώσεις, μπορείτε να χρησιμοποιήσετε τη μαγική σταθερά __NAMESPACE__ ή να καθορίσετε απευθείας τον πλήρη χώρο ονομάτων και το όνομα της κλάσης. Η συνάρτηση class_exists απαιτεί επίσης τον πλήρη χώρο ονομάτων και το όνομα της κλάσης και μπορεί να χρησιμοποιηθεί για να διασφαλιστεί ότι δεν θα δημιουργηθεί μοιραίο σφάλμα λόγω χαμένων κλάσεων.

Χώρος ονομάτων Foo ;
Μπαρ τάξης(
δημόσια στατική δοκιμή συνάρτησης()(
επιστροφή get_called_class();
}
}

χώρος ονομάτων Foo \ Foo ;
κλάση Bar επεκτείνεται \ Foo \ Bar (
}

Var_dump(Bar::test()); // string(11) "Foo\Foo\Bar"

$bar = " Foo\Bar " ;
var_dump($bar::test()); // string(7) "Foo\Bar"

$bar = __NAMESPACE__ . "\Μπαρ" ;
var_dump($bar::test()); // string(11) "Foo\Foo\Bar"

$bar = " Μπάρα " ;
var_dump($bar::test()); // FATAL ERROR: Κατηγορία "Bar" δεν βρέθηκεή Χρησιμοποιείται λανθασμένη κλάση \Bar

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

Η έννοια της σταθεράς και των σταθερών στην PHP

Η λέξη σταθερά θα πρέπει να σας είναι γνωστή από τα μαθηματικά:

«Μαθηματική σταθερά- μια ποσότητα της οποίας η τιμή δεν αλλάζει.

Το ίδιο ισχύει και στην PHP. Constant στην PHPείναι ένα αναγνωριστικό που χρησιμεύει για τον προσδιορισμό μιας απλής τιμής (συμβολοσειράς, κάποιου αριθμού) που δεν μπορεί να αλλάξει κατά την εκτέλεση του κώδικα.

Για να δηλώσετε μια σταθερά (να της αντιστοιχίσετε μια τιμή), χρησιμοποιήστε τη συνάρτηση καθορίζω. Ένα παράδειγμα σταθερής δήλωσης:

Στα σταθερά ονόματα στην PHP γίνεται διάκριση πεζών-κεφαλαίων (τα κεφαλαία και τα πεζά γράμματα είναι διαφορετικά), επομένως πρέπει να είστε προσεκτικοί. Υπάρχει επίσης μια σύμβαση ότι τα ονόματα σταθερών γράφονται πάντα με κεφαλαία.

Το όνομα μιας σταθεράς πρέπει να ξεκινά με ένα γράμμα ή τον χαρακτήρα υπογράμμισης «_» και μπορεί να αποτελείται από γράμματα, αριθμούς και υπογράμμιση.

Εξετάστε ένα απλό παράδειγμα χρήσης σταθεράς:

Σε αυτό το παράδειγμα, δηλώσαμε μια σταθερά και τη χρησιμοποιήσαμε στο πρόγραμμα.

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

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

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

Η χρήση σταθερών διασφαλίζει ότι η τιμή που καθορίζετε όταν δηλώνετε μια σταθερά παραμένει αμετάβλητη.