С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Заблокирован

Как добавить в метод так называемой 'чистоты'?

02.05.2024, 11:16. Показов 805. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеем некий метод:

PHP
1
2
3
4
public function get(string $key): mixed
{
    return array_key_exists($key, $_SESSION) ? $_SESSION[$key] : false;
}
Если в массиве нет ключа, то метод вернёт false.
Если в массиве есть ключ со значением false, то метод вернёт false.

Как понять: в массиве нет ключа или в массиве есть ключ со значением, возвращаемым методом, если бы не было такого ключа?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2024, 11:16
Ответы с готовыми решениями:

[Unity3D] Управление персонажем на телефоне так называемой каплей(джойстиком)
Добрый день, еще давно видел где то в интернете такой красивый "джойстик" в виде капли.. и недавно сыграл в игру от Ubisoft - Mighty Quest....

Написать рекурсивную функцию для вычисления значения так называемой функции Аккермана для неотрицательных чисел n и m

Материнская плата Z77 MPOWER и память Kingston HyperX KHX2400C11D3/8GX. Как добиться чистоты в 2400?
Купил сегодня для мамки память Kingston HyperX KHX2400C11D3/8GX. Установлены они в слоты 2 и 4. Но ни как не могу добиться чистоты в 2400,...

16
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
02.05.2024, 11:38
Цитата Сообщение от HP Fedora Посмотреть сообщение
Как понять: в массиве нет ключа или в массиве есть ключ со значением, возвращаемым методом, если бы не было такого ключа?
PHP
1
2
//в массиве нет ключа
if (!isset($_SESSION[$key]))
0
Заблокирован
02.05.2024, 11:54  [ТС]
crautcher, isset не для этого - ошибка

при существовании ключа со значением null isset вернёт false
0
24 / 19 / 6
Регистрация: 11.02.2022
Сообщений: 45
02.05.2024, 13:28
PHP
1
array_key_exists('first', $search_array)
Может возвращать массив с информацией а не просто bool ?
Например:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public function get(string $key): mixed
{
    if (!array_key_exists($key, $_SESSION)){
        return [
            'key_exist' => false,
            'value' => false
        ];
    }
    
    if (false === $_SESSION[$key]){
        return [
            'key_exist' => true,
            'value' => false
        ];
    }
 
    return [
            'key_exist' => true,
            'value' => $_SESSION[$key]
        ];
}
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,815
02.05.2024, 13:36
Цитата Сообщение от HP Fedora Посмотреть сообщение
Как понять: в массиве нет ключа или в массиве есть ключ со значением, возвращаемым методом, если бы не было такого ключа?
Обычно в подобных функциях передают значение по умолчанию вторым параметром.

PHP
1
2
3
4
public function get(string $key, $default = null): mixed
{
    return array_key_exists($key, $_SESSION) ? $_SESSION[$key] : $default;
}
1
Заблокирован
02.05.2024, 14:15  [ТС]
sad67man, согласен, кстати ИИ шторма так и предлагает даже не проставляя тип второму параметру (ожидается miхed) для совместимости со старыми версиями, которые mixed в тип не умеют делать

но вопрос остаётся открытым

PHP
1
2
3
4
public function get(string $key, mixed $default = null): mixed
{
    return array_key_exists($key, $_SESSION) ? $_SESSION[$key] : $default;
}
Если в массиве нет ключа, то метод вернёт null.
Если в массиве есть ключ со значением null, то метод вернёт null.

Бяда, я так понимаю невозможно это сделать и придётся исключение что-ли выбрасывать (чего изначально не хотелось)?

p.s. неужели разработчики ЯП не могли придумать что-то, что нельзя присваивать ключу массива, чтобы было что вернуть в случае отсутствия ключа и было понятно, что ключа - нет
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,815
02.05.2024, 14:49
HP Fedora, Я так и не понял в чем вопрос..
Цитата Сообщение от HP Fedora Посмотреть сообщение
Если в массиве нет ключа, то метод вернёт null.
Если в массиве есть ключ со значением null, то метод вернёт null.
А как должно работать? Если снаружи хотите проверить только наличие ключа - то пишите отдельный метод. Или возвращайте более сложную структуру данных.
0
24 / 19 / 6
Регистрация: 11.02.2022
Сообщений: 45
02.05.2024, 14:55
HP Fedora, так sad67man вроде дал решение

Если ключа нет - вернет False
Если ключа есть - вернет значение ключа (да, оно может быть null, туда же можно все что угодно установить)

Туда же можно еще и проверку на null или false воткнуть если нужно

PHP
1
return array_key_exists($key, $_SESSION) ? ($_SESSION[$key] === false)?'false':$_SESSION[$key] : $default;
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,815
02.05.2024, 14:56
Лучший ответ Сообщение было отмечено HP Fedora как решение

Решение

HP Fedora,
Цитата Сообщение от HP Fedora Посмотреть сообщение
в случае отсутствия ключа и было понятно, что ключа - нет
Как правило это приравнивают к null или false в зависимости от ситуации.. Можно еще кидать исключения. т.е. это вы сами решаете.
Снаружи может быть вообще не известно откуда берется значение.
0
Заблокирован
02.05.2024, 16:24  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
то пишите отдельный метод
тогда метод get теряет смысл, проверяя наличие ключа и подставляя дефолтное значение, если мы имеем отдельно метод has

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
readonly class Session
{
    public function __construct(
        private string $flashKey = '_flash'
    )
    {
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }
    }
 
    public function set(string $key, mixed $value): void
    {
        $_SESSION[$key] = $value;
    }
 
    public function get(string $key, mixed $default = null): mixed
    {
        return array_key_exists($key, $_SESSION) ? $_SESSION[$key] : $default;
    }
 
    public function has(string $key): bool
    {
        return array_key_exists($key, $_SESSION);
    }
 
    public function remove(string $key): void
    {
        unset($_SESSION[$key]);
    }
 
    public function clear(): void
    {
        $_SESSION = [];
    }
}
Добавлено через 28 секунд
Цитата Сообщение от sad67man Посмотреть сообщение
кидать исключения
похоже придётся так делать
0
Эксперт PHP
 Аватар для liris
4377 / 1017 / 154
Регистрация: 16.01.2023
Сообщений: 2,519
02.05.2024, 16:35
Цитата Сообщение от HP Fedora Посмотреть сообщение
Бяда, я так понимаю невозможно это сделать и придётся исключение что-ли выбрасывать (чего изначально не хотелось)?
Я не очень понимаю вашу идею. Я вижу два варианта применения подобной функции:

1) Я хочу просто получить значение данного поля, вне зависимости от того, где и как оно сохранено (то есть инкапсулировать логику извлечения значения). В таком случае мне не важно, есть это поле в структуре данных или нет. Мне просто нужно значение.

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

PHP
1
2
3
4
5
6
7
$config = [
  'param1' => 100,
];
 
$configObj = new Config($config);
echo $configObj->get('param1', 200); // 100
echo $configObj->get('param2', 200); // 200
2) Я хочу получить значение из объекта, и мне важно чтобы оно было ровно таким, какое оно в объекте. Например у меня есть маппер, который загружает в объект информацию из БД. Затем я могу модифицировать объект и сохранить (данные запишутся в БД, обновив исходную строку).

В таком случае, если я буду подставлять значение по умолчанию - в базу неявно запишутся данные, которых изначально не было.

Значит в такой ситуации нельзя использовать значение по умолчанию. И при обращении к несуществующему полю нужно либо выбрасывать исключение (это нормальная история, его можно и нужно корректно обрабатывать), либо возвращать составной объект, который кроме непосредственно значения содержит информацию о наличии значения (как в сообщении №4).
0
Заблокирован
02.05.2024, 16:42  [ТС]
liris, в том виде, в котором метод существует, то он при отсутствии ключа массива вернёт false, в итоге нам не очень понятно: в массиве нет ключа или в массиве есть такой ключ со значением false
0
Эксперт PHP
 Аватар для liris
4377 / 1017 / 154
Регистрация: 16.01.2023
Сообщений: 2,519
02.05.2024, 16:45
Лучший ответ Сообщение было отмечено HP Fedora как решение

Решение

Цитата Сообщение от HP Fedora Посмотреть сообщение
liris, в том виде, в котором метод существует, то он при отсутствии ключа массива вернёт false, в итоге нам не очень понятно: в массиве нет ключа или в массиве есть такой ключ со значением false
Я как раз об этом и пишу, что в некоторых ситуациях это абсолютно недопустимо. Если вам важно, чтобы поле существовало - проверяйте на существование перед получением значения. Или бросайте исключение.

Если не принципиально существование - используйте значение по умолчанию. Или возвращайте хотя бы null.
0
Заблокирован
02.05.2024, 16:46  [ТС]
liris,

PHP
1
2
3
$array = [];
 
get('a'); // false, такого ключа нет или такой ключ есть со значением false?
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,815
02.05.2024, 16:57
HP Fedora, Мы должны исходить от использования, а не от внутренней реализации..
Вы можете представить такую ситуацию, когда это имеет разницу? для сессии отсутствие ключа и значение null можно приравнять.
0
Заблокирован
02.05.2024, 17:03  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
отсутствие ключа и значение null можно приравнять
Цитата Сообщение от liris Посмотреть сообщение
Или возвращайте хотя бы null
в таком случае достаточно будет

PHP
1
return $_SESSION[$key] ?? $default;
правильно понял?
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,815
02.05.2024, 17:07
Лучший ответ Сообщение было отмечено HP Fedora как решение

Решение

Цитата Сообщение от HP Fedora Посмотреть сообщение
правильно понял?
Да.

Тут даже если вы как-то сможете снаружи это определить - вам же все равно нужно будет делать какую-то проверку


Допустим есть некий псевдокод

PHP
1
2
3
4
$val = $session->get('test');
if ($val->isRealValue()) {
    ///
}
PHP
1
2
3
4
$val = $session->get('test');
if ($session->has('test')) {
    ///
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.05.2024, 17:07
Помогаю со студенческими работами здесь

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

Как правильно добавить метод
Есть коллекция ArrayList, которая содержит какие-то объекты. Хочу написать метод сортировки по возрастанию/убыванию(не принципиально). ...

Как добавить данный метод?
Как создать 2 одинаковых метода? Устройство или ОС, прошивка: все платформы Добрый день, есть mainactivity.java в котором есть ...

Как добавить функцию в метод?
Всем привет, я изучаю ооп. Такое вопрос - как сделать типо такого: class ab { //1 public function a($a) { //тут передаю...

Как добавить команду Contains в метод
У меня есть строка в контроллере которая ловит из input название Хентая и выводит его на страницу ( что то вроде поисковика по названию) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru