Можно ли переопределить isset, избегая нулевых значений в PHP? - PullRequest
3 голосов
/ 08 марта 2019

Я сталкиваюсь с проблемой, с которой, как мне кажется, все сталкиваются с нулем: то есть существуют разные виды нуля.Это может означать «пустой», «неизменный», «неустановленный», «неизвестный» или любое количество вещей.И я дошел до того, что мне нужно как-то различать их.

По сути, у меня есть часть менеджера баз данных моей программы, которая получает объект, представляющий данные для обновления в базе данных, из другой части моей программы.он отвечает за проверку данных формы и преобразование их в указанный объект (который имеет один из нескольких различных классов с конкретными предопределенными свойствами).Мне нужен какой-то способ отличить свойство «null» в этом объекте, что означает «я действительно хочу, чтобы значение null сохранялось в базе данных», и другой тип «null», что означает «если в базе данных есть существующее значение,не меняй это ".Из этих двух последний будет гораздо более распространенным, но мне нужен какой-то способ, чтобы учесть и первое.

Моя текущая мысль, которая кажется наилучшей в этой ситуации, такова:создать новый класс, который представляет каждый тип null, например, класс Unchanged стихов типа SetToNull или что-то в этом роде.Тогда я мог бы установить свойство для экземпляра одного из этих классов.

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

Я знаю, что могу сделать что-то вроде этого:

if (isset($thing->property) && !($thing->property instanceof Unchanged || $thing->property instanceof SetToNull)){
    // do whatever
}

Тем не менее, это явно не идеально, потому что это долго и громоздко, и я не хочу, чтобы это было везде по всей моей кодовой базе.Я бы предпочел что-то вроде этого:

if (myCustomIsset($thing->property)){
    // do whatever
}

Однако isset не кажется нормальной функцией;каким-то образом он подавляет предупреждения, если свойство не было определено или что-то в этом роде, поэтому я сам не уверен, как реализовать что-то подобное.

Ответы [ 2 ]

4 голосов
/ 08 марта 2019

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

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

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

3 голосов
/ 08 марта 2019

Одна вещь, которая приходит на ум, которую я сделал в прошлом, это два прохода в двух аргументах.Первый аргумент - это сам объект.Второй аргумент - это строка, содержащая имя свойства.

Вот пример:

function MyCustomIsset($object, $property) {
    return isset($object->$property) && !($object->$property instanceof Unchanged || $object->$property instanceof SetToNull);
}

А вот как вы могли бы использовать его:

if (myCustomIsset($thing, "property")){
    // do whatever
}

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

...