__MÉTODO__ y __FUNCIÓN__

4 minutos de lectura

avatar de usuario
LF00

Sé la diferencia entre estos dos, y he revisado el manual.

Todavía tengo algo de confusión. Puedo usar __FUNCTION__ en método de clase, esto representa el nombre de este método. Cuando lo hago eco, solo muestra el nombre. Aquí está claro.

Pero por qué puedo usar __METHOD__ en un método no calss. Esto también solo representa el nombre de la función normal. ¿La función normal está en algún contenedor? y cuando eco __METHOD__ en la función normal, el contenedor no es nada?

Código:

<?php
class dog {
    private $name="dog";

    public static function name() {
        echo __METHOD__;
        echo"\n";
        echo __FUNCTION__;
        echo"\n";
    }

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

dog::name();
test();

producción:

ei@localhost:~$ php test.php
dog::name
name
test
test

Cualquier ayuda será apreciada. Gracias.

  • ambos son iguales fuera de la clase. Puedes usar cualquiera de ellos pero personalmente uso __FUNCTION__.

    – Aabir Hussein

    28 de diciembre de 2016 a las 5:57


avatar de usuario
saito

“Método” es básicamente el nombre de una función dentro de una clase (o función de clase). Por lo tanto __METHOD__ consiste en el nombre de la clase y el nombre de la función llamada (dog::name), tiempo __FUNCTION__ solo le da el nombre de la función sin ninguna referencia a la clase en la que podría estar.

Cuando __METHOD__ se llama fuera de una clase es lo mismo que __FUNCTION__ porque no hay una parte de clase para usar como prefijo. Puedes usar __METHOD__ fuera de una clase porque es una constante mágica y siempre están disponibles (en el peor de los casos, devolverán una cadena vacía).

http://php.net/manual/en/language.constants.predefined.php

  • En su respuesta si mal uso no tiro exceptios, volvio a leer rapidamente el manual, y no lo encontre. Si echo de menos algo.

    – LF00

    28 de diciembre de 2016 a las 3:41

  • El mal uso de las constantes arroja excepciones si desea usar constantes que se definieron como no públicas dentro de una clase desde el exterior. Las constantes mágicas cambian dependiendo de dónde se usen, pero son accesibles globalmente.

    – saito

    28 de diciembre de 2016 a las 3:55

avatar de usuario
Subrat Kumar Palhar

dejame aclarar tu duda..

  • Primero explicaré sobre CLASE Y OBJETO (cuál es la diferencia …)

  • Luego aclararé sobre FUNCIÓN Y MÉTODO (cuál es la diferencia …)

hablando de Clase :: Es una implementación lógica …

objeto :: Es una instancia de tu clase (instancia ~ COPY ~ clon ~ …)

cuando está utilizando el operador –NUEVO– —> está creando un OBJETO (nada más que la COPIA) DE SU CLASE.

CLASE =============> ~NUEVO~ =======> OBJETO (Nueva copia de tu clase..) similarmente

FUNCIÓN ==========> ~NUEVO~ =======> MÉTODO (Pertenece al Objeto, no a la Clase)

La clase es el programa que está escribiendo, mientras que el objeto es la copia de su clase que se está ejecutando.

la clase reside en la ROM (permanente) mientras que el objeto reside en la RAM (área de memoria temporal…)

& cuando está declarando una función como estática, pertenece solo a la clase, no al objeto & puede llamar a la misma (función estática) usando ClassName::staticFunctionName()

¡Es por eso que no existe STATIC_METHOD sino STATIC_FUNCTION!

ejemplo de código::

<?php

class Dog extends CI_Controller {

  public function __construct() {
    parent::__construct();
  }

  public function index($params="") {
  }

  private $name="dog";

  public static function name() {
    echo 'Inside static function & inside class' . '<br>';
    echo __METHOD__ . '<br>';
    echo __FUNCTION__ . '<br>';
  }

  public function test2() {
    echo 'Inside NON STATIC function & inside class' . '<br>';
    echo __FUNCTION__ . '<br>';
    echo __METHOD__ . '<br>';
  }
}

function test() {
  echo 'Inside NON STATIC function & OUTSIDE class' . '<br>';
  echo __FUNCTION__ . '<br>';
  echo __METHOD__ . '<br>';
}

Dog::name();
test();
$somevar = new Dog;
$somevar->test2();

PRODUCCIÓN::

Inside static function & inside class
Dog::name               //Class::function
name
    
Inside NON STATIC function & OUTSIDE class
test
test
    
Inside NON STATIC function & inside class
test2
Dog::test2            //Object::method

En su caso, ya que está utilizando MÉTODO EN un contexto estático, muestra el nombre de la clase si no fuera estático (función simple), solo mostraría el nombre de la función.

en todos los lenguajes de programación.. Método siempre corresponde a Objeto. Método Objeto mientras que Función siempre corresponde tanto a la clase como al Objeto (Función estática).

y finalmente no existe la existencia del Método Estático

&

En este caso..

MÉTODO => incluye el nombre de la clase
FUNCIÓN => Solo se refiere al nombre de la función

si alguna aclaracion contactame..

  • Como se puede ver en mi código yo el __METHOD__ en una función que no está en una clase, no muestra el nombre de la clase.

    – LF00

    18 de diciembre de 2017 a las 9:06

  • sí, su función test () reside fuera de la clase y si hubiera dentro de la clase [NON STATIC ] Habría devuelto el nombre de la clase y el método (No confundir con la función) Nombre..

    – Subrat Kumar Palhar

    18 de diciembre de 2017 a las 12:40

¿Ha sido útil esta solución?