2013-12-19 3 views
0

Так что у меня этот functioinПередача переменной в качестве ссылки на метод

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

} 

Я хочу дать ему переменную/массив [ключ], и если ключ не существует, то она возвращает ложь вместо ошибки.

Я использую laravel 4. Он отлично работает как функция, и если я создаю помощники класса и загружаю его из папки библиотек внутри папки приложения, я могу получить к ней доступ через переменную Helpers ::, и он отлично работает.

// 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 я получаю ошибку

$test is undefined, когда я использую Utilities::variable($test). $ test, конечно, не определен, но с двумя другими функциями/методом он работает так, как ожидалось, и я становлюсь ложным и не ошибаюсь.

Любая идея, почему я такой? Я использую Facades, и класс имеет пространство имен, это проблема?

ответ

1

Если вы передаете переменную функции, она должна быть определена в первую очередь. Вокруг него нет пути (по крайней мере, я не знаю). Вы можете удивиться, почему это работает, если вы используете только isset($test). Это потому, что isset() и empty() являются языковыми конструкциями и не функциями.

От kunststube.net/isset:

Исеть и пусто не на самом деле обычные функции, но языковые конструкции. Это означает, что они являются частью языка PHP, не играют обычными правилами функций и, следовательно, могут уйти, не вызывая ошибки для несуществующих переменных.

И если вы хотите проверить, существует ли ключ внутри массива, array_key_exists, вероятно, лучше, чем isset.

Edit:

А теперь я вижу. Это действительно проблема с Фасад. Согласно ответу Густэка, передавая переменную по ссылке, создается переменная (если она не определена). Вот почему ваши первые два подхода работают нормально. Однако с помощью ваших фасадов вы не вызываете свой статический метод напрямую, а через другой слой. И этот получает ваш аргумент по значению, а не по ссылке.

// 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 возвращает ложь для нуль)

Можно было бы ожидать, чтобы получить такая же ошибка в вашем случае, но когда вы пытаетесь ссылаться на неопределенную переменную, она создается без ошибок, кажется, делается так, как это намеренно. Вы можете прочитать об этом in documentation(2nd note)

Лучше спросите, почему они сделали это так.

Смежные вопросы