2016-12-21 10 views
0

Я написал validation черту для моей модели классов, а также библиотеку отчетов об ошибках, какие форматы и возвращает JSON объект ошибки, предупреждения и т.д.Избегайте `Undefined Property` в PHP при использовании` isset() `в обратном вызове?

В моей validation черты, у меня есть этот метод ...

function hasValue($value) 
{ 
    return (isset($value) && !(trim($value) === '')); 
} 

PHP выбросит потеплению, если я просто пытаюсь использовать !(trim($value) в условном, который говорит мне, что переменная не определена. Таким образом, вы должны сделать это ...

if (isset($value) && !(trim($value) === '')) 
    //Do Something 

Я создал этот метод для консолидации является очень распространенной задачей, требующей два метода в один метод, но я получаю такое же предупреждение, как если бы я использовал метод trim() в одиночестве.

Есть ли способ сделать это без отключения предупреждений?

EDIT

Там, кажется, некоторая путаница. Мне нужно, чтобы это работало для переменных и свойств объекта. Я пытаюсь превратить это ...

if (empty($obj->email) && $this->validateEmail($obj->email)) 
    //Do Something 

в это ...

if ($this->validateEmail($obj->email)) 
    //Do Something 

Имея мой hasValue() метод вызвать на волю, и внутри метода validateEmail().

+0

Вы можете попробовать '(isset ($ value))? ! (trim ($ value) === ''): false; 'если вы пытаетесь сохранить все в одной строке – Drew

+0

Не то, чтобы я НЕ МОЖЕТ писать это каждый раз, я ищу удобочитаемость и удобство использования , Я НЕ ХОЧУ писать его каждый раз. – Allenph

+0

Может быть, я что-то пропустил, но я делаю такие вещи, как это ... 'if ((isset ($ value)) && (! Empty ($ value))) {$ value = trim ($ value); do something} else { // значение ошибки не было установлено или было установлено значение null } ' –

ответ

2

Это может быть разумное место для использования модификатора @ для подавления предупреждений.

if (@trim($value) != '') 

$value Если не определен, то он будет преобразован в пустую строку. Использование @ подавляет предупреждающее сообщение, когда это происходит.

+0

Это все равно не решит проблему использования функции внутри других функций проверки, таких как 'validateEmail'. – Allenph

+0

Я предпочел бы предложить манипуляцию типа 'if (! Empty (trim ((string) $ value))) {}'. Подавление - это [последний] (http://stackoverflow.com/a/1369946/4982088) курорт – Xorifelse

+0

Вам нужно использовать '@' в точке, где вы ссылаетесь на переменную, которая не может быть определена. – Barmar

1

Проблема у Вас есть то, что ваша функция hasValue() оценивает оба утверждения isset($value) и !(trim($value) === '') в один

Вместо этого вы должны оценить !(trim($value) === '')еслиisset($value) равен истинной. Это делается путем удаления внешних скобок.

function hasValue($value){ 
    return isset($value) && !(trim($value) === ''); 
    # if this ^^^^ is false this ^^^^ is never executed and no warning generated. 
} 

Это разрешило бы предупреждение, однако hasValue() звучит как функция, чтобы проверить, если какая-либо переменная имеет значение, возможно, сделать это вместо того, чтобы:

function hasValue($value){ 
    return isset($value) && !empty($value) || is_string($value) && !empty(trim($value)); 
} 

var_dump(hasValue(null)); // false 
var_dump(hasValue(true)); // true 
var_dump(hasValue(false)); // false 
var_dump(hasValue([])); // false 
var_dump(hasValue('')); // false 
var_dump(hasValue(' ')); // false 
var_dump(hasValue('a')); // true 

interface validateInterface{ 
    public static function validateEmail($email); 
    public static function validateEmailObj(); 
} 

trait validateTrait{ 
    static function validateEmail($email){ 
    return filter_var($email, FILTER_VALIDATE_EMAIL); 
    } 
    function validateEmailObj(){ 
    return filter_var($this->email, FILTER_VALIDATE_EMAIL); 
    } 
} 

# Implementing an interface is not required, but recommended as traits are easily overwritten. 
class MyClass implements validateInterface{ 
    use validateTrait; 

    public $email; 

    function __construct($email){ 
    if(self::validateEmail($email)){ 
     echo 'works statically inside'; 
    } 

    $this->email = $email; 
    } 
} 

$mail = '[email protected]'; 

if(MyClass::validateEmail($mail)){ 
    echo 'works statically outside class'; 
} 

if((new MyClass($mail))->validateEmailObj()){ 
    echo 'works with objects'; 
} 

Для более длинного списка значений, что Исеть и пусто см. here

+0

Ваш код не работал для меня как метод по моему признаку с переменными или свойствами объекта. – Allenph