Updated PHP Windows builds for Brotli security fix

Constantes mágicas

Las constantes mágicas son palabras clave que se sustituyen por información sobre su propia ubicación en el código fuente: su archivo y su línea, así como la función, clase, trait, espacio de nombres o hook de propiedad que las contiene. A pesar de su nombre, no son constantes reales: defined() y constant() no las reconocen, y una constante del mismo nombre creada con define() no las afecta. No distinguen entre mayúsculas y minúsculas. Cuando se usan fuera del contexto correspondiente (p. ej. __CLASS__ fuera de una clase), se sustituyen por una cadena vacía.

Constantes mágicas de PHP
Nombre Descripción
__LINE__ El número de la línea en la que está escrita.
__FILE__ La ruta completa y el nombre del archivo en el que está escrita, con los enlaces simbólicos resueltos.
__DIR__ El directorio del archivo, equivalente a dirname(__FILE__). No incluye la barra final a menos que sea el directorio raíz.
__FUNCTION__ El nombre de la función en la que está escrita, incluido su espacio de nombres (p. ej. Foo\bar). Dentro de un método, solo el nombre del método. Para las funciones anónimas, un nombre generado por el motor que incluye el lugar donde se definió la closure (a partir de PHP 8.4.0; anteriormente {closure}).
__CLASS__ El nombre de la clase en la que está escrita, incluido su espacio de nombres (p. ej. Foo\Bar). Dentro de un trait, el nombre de la clase que usa el trait. Para las clases anónimas, un nombre generado por el motor. Para obtener el nombre de la clase sobre la que se llamó a un método, use static::class.
__TRAIT__ El nombre del trait, incluido su espacio de nombres (p. ej. Foo\Bar).
__METHOD__ El nombre de la clase y del método en el que está escrita (p. ej. Foo\Bar::baz). Dentro de un trait, se usa el nombre del trait en lugar del nombre de la clase. Fuera de un método, es igual que __FUNCTION__.
__PROPERTY__ El nombre de la propiedad, cuando se usa dentro de un hook de propiedad. Disponible a partir de PHP 8.4.0.
__NAMESPACE__ El nombre del espacio de nombres actual.

Ejemplo #1 Uso de las constantes mágicas

<?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";

El ejemplo anterior mostrará:

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
7 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