3

我有一些绑定到一些变量的闭包。

例如

$x = function() { echo "hi there"; };

我想确保 $x 永远不会无意中切换到其他值。知道怎么做吗?

我不能使用常量,因为它们只能解析为标量值。

4

4 回答 4

5

这段代码的目的是什么?

我的意思是,函数本身就是常量,因为它们不能被重新声明。那为什么不这样做呢?

function x() { echo "hi there"; };

如果您在闭包中工作,则始终可以使用namespace,因此您的函数不会遇到闭包之外的冲突。

于 2013-09-26T15:40:16.403 回答
1

我不认为你可以做到这一点:

  • 变量旨在改变它们的值
  • 常量不能容纳函数

但我提出了一个解决方法,这是我想出的唯一方法,不知道它是否适合你: 使用类这是__destruct()神奇的方法

Class Hulk {
    function __construct(){
        echo "Hulk is born!<br>";
    }

    function __destruct(){
        throw new Exception('Someone is trying to destroy Hulk, not knowing that he is indestructible!!!');
    }
}

$x = new Hulk();
$x = "hello";

当您尝试将“hello”分配给 X 时,它会抛出异常:

 Fatal error: Uncaught exception 'Exception' with message 'Someone is trying to destroy Hulk, not knowing that he is indestructible!!!' in /Applications/MAMP/htdocs/test.php:38 Stack trace: #0 /Applications/MAMP/htdocs/test.php(44): Hulk->__destruct() #1 {main} thrown in /Applications/MAMP/htdocs/test.php on line 38

你也可以让它变得更安静,只做一个回声或任何你想做的事情。同样通过这种方式,您可以将一系列函数分组为类中的方法,并确保它们始终可以访问。

于 2013-09-26T15:46:11.303 回答
1

使用Closure的好方法是用一些辅助类来包装它,这就是我使用的

class Events {
    private $events;
    public function addEvents($eventName, Closure $c){
    $this->events[$eventName] = $c;
  }
   public function call($eventName, $args = array()){
    if (empty($args)){
        $this->events[$eventName]();
   }else {
     call_user_func_array($this->events[$eventName], $args);
     }
   }
}

用法

$events = new Events();
$events->addEvents('event', function(){
    echo 'hi'; 
 });
$events->call('event');

这里键盘测试链接

于 2013-09-26T15:48:34.297 回答
0

只写一个普通的命名函数?如果您想要一个恒定的固定名称,那似乎是显而易见的答案。

如果您绝对必须根据您的代码使其动态化,但不能在您的控制之外进行更改,我建议将其放入一个类中。将实际变量设置为私有,并为其提供公共 getter,但不提供 setter。

于 2013-09-26T15:40:40.537 回答