2013-09-26 73 views
3

我有一些關閉,我已經綁定了一些變量。如何聲明一個php變量爲常量

例如

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

我想確保$ x永遠不會無意中切換到其他值。任何想法如何做到這一點?

我不能使用常量,因爲它們只解析爲標量值。

回答

5

這段代碼的目的是什麼?

我的意思是,功能是常量自己,因爲他們不能重新申報。那麼爲什麼不這樣做呢?

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

如果你是在一個封閉的工作,你總是可以使用一個namespace,所以你的函數不會關閉的一個碰撞外見面。

0

只需編寫一個常規的命名函數?如果你想要一個固定的名字,這似乎是一個明顯的答案。

如果您絕對必須根據您的代碼使其具有動態性,但不能從您的控制之外更改,我建議將它放入課程中。將實際變量設置爲private,併爲其提供公共getter,但不是setter。

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"; 

當您嘗試分配「你好」 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 

您也可以使它更安靜正是這樣做你想做的回聲或。通過這種方式,您可以將一系列函數組合爲課程中的方法,並確保它們始終可訪問。

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'); 

here鍵盤測試環節