__METHOD__和__FUNCTION__

2022-08-30 17:05:23

我知道这两者之间的区别,我已经检查了手册。

我有一些困惑。我可以在类的方法中使用,这表示此方法的名称。当我回显它时,它只输出名称。这里很清楚。__FUNCTION__

但是为什么我可以在非calss方法中使用。这也只是代表了正常函数的名称。正常功能是否在某个容器中?而当回声在正常功能中,容器是没有的吗?__METHOD____METHOD__

法典:

<?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();

输出:

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

任何帮助将不胜感激。谢谢。


答案 1

“方法”基本上只是类(或类函数)中函数的名称。因此,它由类名和名为 () 的函数名组成,而只为您提供函数的名称,而不对它可能所在的类进行任何引用。__METHOD__dog::name__FUNCTION__

当 在类外部调用时,它与因为没有类部分用作前缀相同。你可以在类之外使用,因为它是一个神奇的常量,它们总是可用的(在最坏的情况下,它们会返回空字符串)。__METHOD____FUNCTION____METHOD__

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


答案 2

让我澄清你的疑惑。

  • 首先,我将解释类和对象(有什么区别..)

  • 然后我将澄清函数和方法(有什么区别..)

谈论类 :: 这是你的逻辑实现..

对象 :: 它是你的类的一个实例 (实例 ~ COPY ~ 克隆 ~ ...)

当您使用 --NEW-- 运算符--->您正在创建类的对象(除了 COPY 之外什么都没有)。

类 =============> ~NEW~ ==========> 对象(类的新副本..) 类似

函数 ==========> ~NEW~ =======>方法(属于对象而不是类)

类是您正在编写的程序,而对象是正在执行的类的副本。

类驻留在 ROM(永久)中,而对象驻留在 RAM(临时内存区域..)

当你将一个函数声明为静态时,它只属于类而不是对象,你可以使用ClassName::staticFunctionName()调用same(static function)。

这就是为什么不存在STATIC_METHOD而不是STATIC_FUNCTION !!!

代码示例::

<?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();

输出::

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

在你的情况下,当你在静态上下文中使用方法时,它会显示类名,如果它是一个非静态(简单函数),它将只显示函数名称。


推荐