¿Qué son los enlaces estáticos tardíos en PHP?

En PHP, los programas se guardan y luego se ejecutan directamente en el navegador, el script se ejecuta a través de un servidor web y obtenemos el resultado. No compilamos programas PHP manualmente, pero eso no significa que nunca se compilan. El intérprete de PHP lo hace por usted y lo ejecuta. Entonces hay dos fases, primero, tiempo de compilación y segundo tiempo de ejecución. Durante el tiempo de compilación, las variables normales se reemplazan con sus valores, pero las palabras clave estáticas se reemplazan solo en el tiempo de ejecución. Anulando una propiedad en la clase secundaria y creando la instancia de la clase secundaria, para obtener el resultado anulado, el concepto de enlace estático tardío se usa escribiendo la palabra clave estática antes de usar la propiedad. Cada vez que un intérprete de PHP recibe la solicitud para compilar una función. Si ve alguna propiedad estática, luego deja la propiedad pendiente para el tiempo de ejecución y la propiedad obtiene su valor durante el tiempo de ejecución de la función a la que se llama. Esto se denomina enlace estático tardío.

Esta característica de enlace estático tardío se introdujo en PHP 5.3 y superior, las versiones anteriores mostrarán un error fatal.

Los siguientes ejemplos ilustran el enlace estático tardío en PHP:

Ejemplo 1: en el siguiente código, tenemos una clase Auto y su clase secundaria newCar . Tenemos algún problema cada vez que intentamos acceder a la función getOwner() a través del operador de resolución de alcance (sin crear un objeto). Ambas clases tienen la función getCar() pero cada vez que llamamos a la función getOwner() a través de la clase newCar, heredará la función getCar() en la clase Car en lugar de newCar.

  • Programa: En este programa no usaremos el enlace estático, usaremos la vieja escuela, luego obtendrá la idea del enlace estático tardío.

    <?php
      
    // Car function
    class Car
    {
        public static $name = 'Tesla';
        public static function getCar()
        {
            return "The car name is : " . self::$name;
        }
        public static function getOwner()
        {
            echo self::getCar();
        }
    }
    class newCar extends Car
    {
      
        public static function getCar()
        {
      
            return "The car name is : " . self::$name
                            " and owner is Anshu.";
        }
      
    }
    Car::getOwner();
    echo "\n";
    newCar::getOwner();
      
    ?>
  • Producción:
    The car name is : Tesla
    The car name is : Tesla
  • Programa 2: Una cosa que podemos hacer es copiar la función getOwner() de la clase Car a la clase newCar pero se puede hacer para programas pequeños. ¿Qué sucede si su programa contiene de 100 a 1000 funciones? Para resolver esto, se puede usar la palabra clave static en lugar de self. La clase newCar no contiene la función getOwner() pero aun así hereda la función getCar() de newCar . Esto sucedió porque getOwner() está llamando a getCar() en tiempo de ejecución en lugar de en tiempo de compilación. Acceso en tiempo de ejecución de la función getOwner() en la clase Car y no la compilación o el acceso temprano. De esta forma, podemos obtener la función getOwner() ennewCar() clase sin crear un objeto.

    <?php
      
    // Car function
    class Car
    {
        public static $name = 'Tesla';
        public static function getCar()
        {
            return "The car name is : " . self::$name;
        }
        public static function getOwner()
        {
            echo static::getCar();
        }
    }
    class newCar extends Car
    {
      
        public static function getCar()
        {
      
            return "The car name is : " . self::$name
                            " and owner is Anshu.";
        }
      
    }
    Car::getOwner();
    echo "\n";
    newCar::getOwner();
      
    ?>
  • Producción:
    The car name is : Tesla
    The car name is : Tesla and owner is Anshu.

Ejemplo 2: enlace estático tardío en const, funcionará igual que los métodos estáticos, lo que significa cómo se llama. Para const, no tiene por qué ser necesariamente estático.

  • Programa:

    <?php
    class One
    {
        const MY_CONST = false;
      
        public function selfConst()
        {
            return self::MY_CONST;
        }
      
        public function staticConst()
        {
            return static ::MY_CONST;
        }
    }
      
    class Two extends One
    {
        const MY_CONST = true;
    }
      
    $two = new Two();
      
    // prints "no"
    echo $two->selfConst() ? 'yes' : 'no';
    echo "\n";
      
    // prints "yes"
    echo $two->staticConst() ? 'yes' : 'no';
    ?>
  • Producción:
    no 
    yes

¿Dónde usarlo?

  • Donde se anula una función y desea mostrar las nuevas propiedades.
  • Donde el programa es demasiado grande y no puede escribir la misma función una y otra vez.

Publicación traducida automáticamente

Artículo escrito por AnshuMishra3 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *