【问题标题】:__METHOD__ and __FUNCTION____METHOD__ 和 __FUNCTION__
【发布时间】:2017-05-12 07:33:08
【问题描述】:

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

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

但是为什么我可以在非类方法中使用__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

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

【问题讨论】:

  • 两者在课堂外都是一样的。你可以使用其中任何一个,但我个人使用__FUNCTION__

标签: php function class methods constants


【解决方案1】:

让我澄清你的疑问..

  • 首先我会解释一下 CLASS & OBJECT(有什么区别..)

  • 然后我会澄清一下FUNCTION & METHOD(有什么区别..)

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

object :: 它是你的类的一个实例(instance ~ COPY ~ clone ~ ...)

当您使用 --NEW-- 运算符时 ---> 您正在创建您的 CLASS 的 OBJECT(除了副本)。

CLASS =============> ~NEW~ =======> OBJECT(你的班级的新副本..)类似

FUNCTION ==========> ~NEW~ =======> METHOD(属于对象而非类)

Class 是您正在编写的程序,而 object 是您正在执行的类的副本..

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

& 当您将函数声明为静态时,它仅属于类而不属于对象 & 您可以调用相同的函数(静态函数) 通过使用 ClassName::staticFunctionName()

这就是为什么不存在 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

在您的情况下 当您在静态上下文中使用 METHOD 时,它会显示类名 如果它是一个非静态(简单函数),它只会显示函数名..

【讨论】:

    【解决方案2】:

    “方法”基本上只是类(或类函数)中函数的名称。因此__METHOD__ 由类名和被调用的函数名 (dog::name) 组成,而__FUNCTION__ 只提供函数名,而没有对它可能所在的类的任何引用。

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

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

    【讨论】:

    • 在你的回答中如果误用不抛出异常,我很快又看了一遍手册,没有找到。如果我错过了什么。
    • 如果您想从外部使用在类内部定义为非公共的常量,则滥用常量会引发异常。魔法常数会根据它们的使用位置而变化,但它们是全局可访问的。
    【解决方案3】:

    在每一种编程语言中.. 方法总是对应于对象。 方法 对象 而函数总是对应于类和对象(静态函数)。

    最后不存在静态方法

    &

    在这种情况下..

    METHOD => 包括类名 FUNCTION => 仅指函数名

    如果有任何问题请联系我..

    【讨论】:

    • 正如你在我的代码中看到的,__METHOD__ 在一个不在类中的函数中,它不显示类名。
    • 是的,你的函数 test() 驻留在类之外,如果它在类内 [NON STATIC ] 它会返回类名和方法(不要与函数混淆)名称。 .
    猜你喜欢
    • 2016-05-25
    • 2023-03-09
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多