使用静态变量调用变量函数

时间:2013-03-02 21:55:52

标签: php

方法1 可行,但方法2 不会 - 它会导致致命错误(函数名称必须是...中的字符串< / em>的)

# Approach 1
$function = self::$function and $function();

# Approach 2
self::$function and self::$function();
这不是有点奇怪吗?我希望有人能解释一下。


编辑:为了给出一些背景,这里是一个完整的类:

class Example
{
    static $function;

    static function method()
    {
        self::$function();
    }
}

function callback() {}

Example::$function = 'callback';
Example::method();

3 个答案:

答案 0 :(得分:1)

语法对我来说似乎含糊不清。可能它也适用于PHP。将函数名称保存在局部变量中会更干净,更实用:

static function method()
  $method = self::$function;
  $method();
}

或使用call_user_func()

static function method()
  call_user_func(self::$function);
}

答案 1 :(得分:1)

为什么方法#1有效

这是PHP运算符优先级的工件。

$function = self::$function and $function();

相当于

($function = self::$function) and $function();

当然等同于

$function = self::$function;
if ($function) $function();

最后一行正常,因为这是variable functions的语法。

为什么方法#2不起作用

因为存在歧义,编译器以“错误的方式”解决了这个问题。

考虑一下:

self::$function();

这是否意味着PHP应该调用存储在static属性$function中的回调,或者它应该调用一个静态方法,其名称是变量$function的值?< / p>

PHP与后者有关,但是范围内没有变量$function,首先是通知,然后是错误($function计算为null,这不是字符串)

答案 2 :(得分:1)

如果您不想了解优先级和含糊不清的技术细节,简短的解释是self::$function()的工作原理与$obj->$method()相同;它试图调用$function()的变量函数self