2013-12-19 84 views
0

傳遞變量所以我有此functioin如參照方法

public static function variable(&$var) 
{ 
    if(isset($var)) 
    { 
     return $var; 
    } 
    return false; 

} 

我想給它的可變/陣列[鍵],並且如果該鍵不存在,則它返回false而不是錯誤。

我正在使用laravel 4.它工作正常,如果我創建一個類Helpers並從應用程序文件夾內的庫文件夾自動加載,我可以通過Helpers :: variable訪問它,它工作正常。

// those two work fine 
<?php 
class Helpers { 
    public static function variable(&$var){ 
     return isset($var) ? $var : false; 
    } 
} 

function variable(&$var){ 
    return isset($var) ? $var : false; 
} 

但是如果我創建一個包(與作曲家使用,更多的功能來,所以我想在這裏)https://github.com/lukasoppermann/php-utilities當我使用Utilities::variable($test)我得到一個錯誤

$test is undefined。當然,$ test是未定義的,但是其他兩個函數/方法可以按預期工作,並且我得到錯誤並且沒有錯誤。

任何想法,爲什麼我是這樣的?我使用Facades並且類有一個命名空間,這是一個問題嗎?

回答

1

如果你傳遞一個變量給一個函數,它必須先被定義。周圍沒有辦法(至少我不知道)。您可能想知道爲什麼它只適用於isset($test)。那是因爲isset()empty()是語言結構和而不是功能。

kunststube.net/isset

isset和空實際上不是普通的功能,但語言結構。這意味着它們是PHP語言本身的一部分,不會按照正常的函數規則進行操作,因此可以避免爲不存在的變量觸發錯誤。

如果你想檢查一個數組內是否存在一個鍵,array_key_exists可能比isset更好。

編輯:

啊,我現在看到。這確實是Facades的問題。根據Gustek的回答,通過引用傳遞變量會創建變量(如果未定義)。這就是爲什麼你的前兩種方法工作正常。但是,對於Facades,您不會直接調用靜態方法,而是通過另一個層調用。而這個人收到你的論點的價值,而不是參考。

// See: Illuminate\Support\Facades 
public static function __callStatic($method, $args) 
{ 
    $instance = static::resolveFacadeInstance(static::getFacadeAccessor()); 

    switch (count($args)) 
    { 
     case 0: 
      return $instance->$method(); 

     case 1: 
      return $instance->$method($args[0]); 

     case 2: 
      return $instance->$method($args[0], $args[1]); 

     case 3: 
      return $instance->$method($args[0], $args[1], $args[2]); 

     case 4: 
      return $instance->$method($args[0], $args[1], $args[2], $args[3]); 

     default: 
      return call_user_func_array(array($instance, $method), $args); 
    } 
} 

而且從php.net

注:這些魔術方法的參數 都不能通過引用傳遞。

+0

但爲什麼它與一個正常的功能?幫助者的方法? (在頂部編輯) –

+0

編輯我的答案 – Syjin

0

在PHP當你嘗試用你得到的通知錯誤之前沒有分配任何值,變量與NULL值創建(isset返回false爲空)

這將有望得到變量在你的情況下同樣的錯誤,但是當你試圖引用未定義的變量時,它會被創建而沒有錯誤,似乎是故意的。你可以閱讀關於它in documentation(2nd note)

更好的問題是他們爲什麼這樣做。