Ошибочное подавление аргумента функции Php, пустое () isset () эмуляция

Простой трюк, который я использую, состоит в том, чтобы удвоить исходное фоновое изображение, убедившись, что сначала нарисовано наведенное изображение

.next {
  background: url(../images/next-hover.png) center center no-repeat;
  background: url(../images/next.png) center center no-repeat;
    &:hover{
      background: url(../images/next-hover.png) center center no-repeat;
    }
 }

Нет производительности и очень просто

Или, если вы 'еще не использовать SCSS:

.next {
  background: url(../images/next-hover.png) center center no-repeat;
  background: url(../images/next.png) center center no-repeat;        
 }
 .next:hover{
  background: url(../images/next-hover.png) center center no-repeat;
 }
9
задан Anant Singh---Alive to Die 5 June 2015 в 17:36
поделиться

13 ответов

Подводя итог, надлежащий ответ не, Вы не были должны (видеть протест ниже).

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

Суммирование интересного обсуждения комментария с Gerry: Передача переменной ссылкой действительно допустима, если Вы проверяете на значение переменной в функции и обрабатываете неопределенные или пустые случаи правильно. Просто не используйте ссылку, передающую в качестве способа закрыть PHP (это - то, где мой оригинал не был должен точки к).

7
ответ дан 4 December 2019 в 09:15
поделиться

И движение далее дерева абстракции, для чего Вы используете это?

Вы могли или инициализировать те значения в каждом классе как соответствующие или создать определенный класс, содержащий все значения по умолчанию и атрибуты, как:

class Configuration {

    private var $configValues = array( 'cool' => 'Defaultcoolval' ,
                                       'uncool' => 'Defuncoolval'  );

    public setCool($val) {
        $this->configValues['cool'] = $val;
    }

    public getCool() {
        return $this->configValues['cool'];
    }

}

Так как идея будет этим, когда использование defaultValue будет функционировать везде вверх и вниз в Вашем коде, это станет кошмаром обслуживания каждый раз, когда необходимо изменить значение, ища все места, куда Вы поместили вызов defaultValue. И это также, вероятно, приведет Вас повторять себя, нарушая DRY.

Принимая во внимание, что это - единственное место для хранения всех тех значений по умолчанию. Вы могли бы испытать желание постараться не создавать те методы set и методы считывания, но они также помогают в обслуживании, в случае, если это becomse подходящий сделать некоторую модификацию выводов или проверку исходных данных.

-1
ответ дан 4 December 2019 в 09:15
поделиться

В то время как ответ на исходный вопрос является "нет", существует опции, которые никто не упомянул.

То, когда Вы используете знак, весь PHP делает, переопределяет error_reporting уровень и временно обнуление его. Можно использовать"ini_restore('error_reporting');"для задержки, это к тому, чем это было перед, использовалось.

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

Что-то как:

$var = @foo($bar);

function foo($test_var)
{
     ini_restore('error_reporting');

     if(is_set($test_var) && strlen($test_var))
     {
          return $test_var;
     }
     else
     {
          return -1;
     }
}

Так, в случае выше, если $bar не установлен, я не получу ошибку, когда я буду звонить foo() с несуществующей переменной. Однако я получу ошибку из функции, где я по ошибке ввел is_set вместо isset.

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

0
ответ дан 4 December 2019 в 09:15
поделиться

Я уверен, что могло быть большое обсуждение тернарных операторов vrs вызовы функции. Но точка этого вопроса должна была видеть, можем ли мы создать функцию, которая не бросит ошибку, если не существующее значение передается в, не используя

0
ответ дан 4 December 2019 в 09:15
поделиться

@Sean, Которому уже ответил Brian

return isset($input) ? $input : $default;
0
ответ дан 4 December 2019 в 09:15
поделиться

Sean, Вы могли сделать:

$result = ($func_result = doLargeIntenseFunction()) ? $func_result : 'no result';

Править:

Я уверен, что могло быть большое обсуждение тернарных операторов vrs вызовы функции. Но точка этого вопроса должна была видеть, можем ли мы создать функцию, которая не бросит ошибку, если не существующее значение передается в, не используя

И я сказал Вам, проверьте его с isset(). Первая часть троичного условного выражения не проверяет пустой указатель или не пустая, это проверяет true или false. При попытке проверить true или false на нулевом значении в PHP Вы получаете эти предупреждения. isset() проверки, возвращают ли переменная или выражение нулевое значение или нет, и это возвращает булевскую переменную, которая может быть оценена первой частью Вашего троичного без любых ошибок.

0
ответ дан 4 December 2019 в 09:15
поделиться

Нет, потому что это - действительно ничто, чтобы сделать с функцией; ошибка прибывает из попытки разыменовать несуществующий ключ массива. Можно изменить уровень предупреждения установки PHP к surpress эти ошибки, но Вы более обеспечены просто не выполнение этого.

Однако Вы могли сделать что-то как

function safeLookup($array, $key)
{
  if (isset($array, $key))
    return $array[$key];

  return 0;
}

И используйте его вместо поиска ключа массива

defaultValue(safeLookup($foo, "bar"), "baz);

Теперь я должен принять душ :)

1
ответ дан 4 December 2019 в 09:15
поделиться

Можно сделать это использование func_get_args как так:

error_reporting(E_ALL);
ini_set('display_errors', 1);

function defaultValue() {
    $args = func_get_args();

    foreach($args as $arg) {
        if (!is_array($arg)) {
            $arg = array($arg);
        }
        foreach($arg as $a) {
            if(!empty($a)) {
                return $a;
            }
        }
    }

    return false;
}

$var = 'bob';

echo defaultValue(compact('var'), 'alpha') . "\n"; //returns 'bob'
echo defaultValue(compact('var2'), 'alpha') . "\n"; //returns 'alpha'
echo defaultValue('alpha') . "\n"; //return
echo defaultValue() . "\n";

Этот func идет один шаг вперед и дал бы Вам первое не пустое значение любого количества args (Вы могли всегда вынуждать это только взять до двух args, но этот взгляд, более полезный для меня как это).

Править: исходная версия не использовала компактный, чтобы попытаться сделать массив args и ВСЕ ЕЩЕ дала ошибку. Сообщение об ошибке, ударенное на ступеньку выше и эта новая версия с компактным, немного менее опрятно, но все еще делает то же самое и позволяет Вам обеспечивать значение по умолчанию для не существующий Вар.

3
ответ дан 4 December 2019 в 09:15
поделиться

Вы не получаете ошибки, когда переменная будет передана ссылкой (PHP создаст новую переменную тихо):

 function myHappyFunction(&$var)
 {       
 }

Но я рекомендую против злоупотребления этим для сокрытия программных ошибок.

10
ответ дан 4 December 2019 в 09:15
поделиться

@Brian: Я использую trinary операцию, чтобы сделать проверку на меня:

return $value ? $value : $default;

это возвращает или $value ИЛИ $default. В зависимости от значения $value. Если это будет 0, ложь, пустая или что-либо подобное, то значение в $default будет возвращено.

Я больше иду для проблемы эмулировать функции как пустой () и isset ()

0
ответ дан 4 December 2019 в 09:15
поделиться

можно ли написать функцию таким образом, чтобы можно было передавать недопустимые аргументы или несуществующие переменные, и php не выдаст ошибку без использования '@'

Да, вы можете!

porneL прав [править: у меня недостаточно очков, чтобы связать его ответ или проголосовать за него, но он находится на этой странице]

Он также прав, когда предупреждает "Но я рекомендую не злоупотреблять этим для скрытие ошибок программирования ». однако по этой же причине следует избегать подавления ошибок с помощью оператора управления ошибками (@).

Я новичок в Stack Overflow, но надеюсь, что неправильный ответ не может быть самым высоким на странице, пока правильный ответ не получает голосов. : (

1
ответ дан 4 December 2019 в 09:15
поделиться

Если вы просто добавите к параметру значение по умолчанию, вы можете пропустить его при вызове функции. Например:

function empty($paramName = ""){
    if(isset($paramName){
        //Code here
    }
    else if(empty($paramName)){
        //Code here
    }
}
0
ответ дан 4 December 2019 в 09:15
поделиться

Есть допустимые случаи, когда проверка становится обременительной и необязательной.
Поэтому я написал эту маленькую волшебную функцию:

/**
 * Shortcut for getting a value from a possibly unset variable.
 * Normal:
 *   if (isset($_GET['foo']) && $_GET['foo'] == 'bar') {
 * Short:
 *   if (value($_GET['foo']) == 'bar') {
 *
 * @param mixed  $variable 
 * @return mixed  Returns null if not set
 */
function value(&$variable) {
    if (isset($variable)) {
        return $variable;
    }
}

Она не требует никаких изменений в myHappyFunction ().
Вам придется изменить

myHappyFunction($someBogusVar);

на

myHappyFunction(value($someBogusVar));

, явно указав свое намерение. что делает его хорошей практикой в моей книге.

2
ответ дан 4 December 2019 в 09:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: