Constantes magiques

Les constantes magiques sont des mots-clés qui sont remplacés par des informations sur leur propre emplacement dans le code source : leur fichier et leur ligne, ainsi que la fonction, la classe, le trait, l'espace de noms ou le hook de propriété qui les entourent. Malgré leur nom, ce ne sont pas de vraies constantes : defined() et constant() ne les reconnaissent pas, et une constante du même nom créée avec define() n'a aucun effet sur elles. Elles sont insensibles à la casse. Lorsqu'elles sont utilisées en dehors du contexte auquel elles se rapportent (par exemple __CLASS__ en dehors d'une classe), elles sont remplacées par une chaîne vide.

Les constantes magiques de PHP
Nom Description
__LINE__ La ligne sur laquelle elle est écrite.
__FILE__ Le chemin complet et le nom du fichier dans lequel elle est écrite, avec les liens symboliques résolus.
__DIR__ Le dossier du fichier, équivalent à dirname(__FILE__). Il ne contient pas de slash final, sauf s'il s'agit du dossier racine.
__FUNCTION__ Le nom de la fonction dans laquelle elle est écrite, incluant son espace de noms (par exemple Foo\bar). À l'intérieur d'une méthode, seul le nom de la méthode. Pour les fonctions anonymes, un nom généré par le moteur qui inclut l'endroit où la fermeture a été définie (à partir de PHP 8.4.0 ; auparavant {closure}).
__CLASS__ Le nom de la classe dans laquelle elle est écrite, incluant son espace de noms (par exemple Foo\Bar). À l'intérieur d'un trait, le nom de la classe qui utilise le trait. Pour les classes anonymes, un nom généré par le moteur. Pour obtenir le nom de la classe sur laquelle une méthode a été appelée, utiliser static::class.
__TRAIT__ Le nom du trait, incluant son espace de noms (par exemple Foo\Bar).
__METHOD__ Le nom de la classe et de la méthode dans laquelle elle est écrite (par exemple Foo\Bar::baz). À l'intérieur d'un trait, le nom du trait est utilisé à la place du nom de la classe. En dehors d'une méthode, identique à __FUNCTION__.
__PROPERTY__ Le nom de la propriété, lorsqu'elle est utilisée à l'intérieur d'un hook de propriété. À partir de PHP 8.4.0.
__NAMESPACE__ Le nom de l'espace de noms courant.

Exemple #1 Utilisation des constantes magiques

<?php
namespace App;

function helper()
{
    echo __FUNCTION__, "\n";
    echo __METHOD__, "\n";
}

trait Greets
{
    public function greet()
    {
        echo __CLASS__, "\n";
        echo __TRAIT__, "\n";
        echo __METHOD__, "\n";
        echo __FUNCTION__, "\n";
    }
}

class Greeter
{
    use Greets;
}

helper();
(new Greeter)->greet();
echo __NAMESPACE__, "\n";

L'exemple ci-dessus va afficher :

App\helper
App\helper
App\Greeter
App\Greets
App\Greets::greet
greet
App
+add a note

User Contributed Notes 5 notes

up
4
theking2 at king dot ma
4 years ago
If PHP is run inside a web server request there is an important difference between the __DIR__ constant and $_SERVER['DOCUMENT_ROOT'].

Where __DIR__ of a PHP script contained within a sub-folder will include the complete server path $_SERVER['DOCUMENT_ROOT'] will contain a server path up to the _root_ of the application. This can be helpful when for instance an auto-loader is defined in an include file sitting inside a sub-folder and where the classes are located in another folder at the root of the application.
up
1
webmaster at event-horizon dot lt
6 months ago
I have got this script:
<?=
$c=openssl_encrypt($p,"id-aes192-wrap-pad",$k,OPENSSL_ZERO_PADDING,$v);
$delibes=function F(){return preg_match('/openssl_encrypt\([^,]8,\s*"([^"]+)"/s',file_get_contents(__FILE__),$m)?$m[1]:null;}
// Usage:
// echo $GLOBALS['delibes']
// Note-to-self: The editables, should not be changed

I have no idea how to change __FILE__, perhaps using __DIR__."but what is the relative path?"
up
0
Athralon dot media at gmail dot com
6 months ago
This is a magic constant: "but what is the relative path?"
up
0
dirk at biztechwiz dot com
6 months ago
Getting the magic constants from the right place is important.  For example, creating a function to log location information requires explicit inclusion.

<?php
/***********
* magic_constants_include.php
*
* Magic constant test include file
*/
function showInclude($file=__FILE__, $lineno=__LINE__) {
    echo "Parameter values: $file ($lineno)\n";
    echo "Local constants: " . __FILE__ . "; " . __LINE__ . "\n";
}
?>

<?php
/************
* magic_constants_test.php
*/

require_once 'magic_constants_include.php';

echo "Function call with parameter defaults:\n";
showInclude();

echo "Function call with parameter explicit magic constants:\n";
showInclude(__FILE__, __LINE__);
?>

Results:
php -f magic_constants_test.php
Function call with parameter defaults:
Parameter values: /home/dirk/project/dirk/php/magic_constants_include.php (7)
Local constants: /home/dirk/project/dirk/php/magic_constants_include.php; 9
Function call with parameter explicit magic constants:
Parameter values: /home/dirk/project/dirk/php/magic_constants_test.php (12)
Local constants: /home/dirk/project/dirk/php/magic_constants_include.php; 9
up
-2
chris at ocproducts dot com
3 years ago
Note that __CLASS__ and __METHOD__ both reference the class the code is written in, not whatever the object class is. E.g. if you have an object of class B inheriting from class A, any usage of __CLASS__ in class A is going to give "A".
To Top