Есть ли способ перегрузить логику пустой() для пользовательских классов на PHP?

Есть ли способ перегрузить логику пустой() для пользовательских классов на PHP? например:

class X implements Stringable {
    private string $value;
    public function __toString(): string {
        return ''; # not even checking the values, always empty
    }
    # doesn't matter for the obj, only for protected properties, but
    # will not cause error on the private here...
    public function __isset(string $value): bool {
        return false;
    }
}

И простой тест

    public function testXisEmpty(): void {
        $actual = new X();
        $this->assertTrue( empty($actual) );
    }
  ✘ X is empty
   ┐
   ├ Failed asserting that false is true.

Есть ли способ заставить empty() уважать ценность toString? или есть что-то вроде toBool? или isset для объекта, а не просто поля?

Не удалось найти ничего в руководстве, но я также трачу много времени на просмотр перегрузок свойств, прежде чем узнал, что перегрузки классов называются «магическими» методами, поэтому, возможно, я просто упускаю правильную номенклатуру...

Некоторые эксперты считают, что использование пустой логики PHP — плохая практика: dev.to/klnjmm/never-use-empty-function-in-php-4pb0

Monday 06.08.2024 06:11
empty в конце проводит тест на правдивость. Итак, вопрос сводится к следующему: можете ли вы изменить истинность (логическое значение) пользовательского класса? На что ответ: нет.
deceze 06.08.2024 06:15

Ожидается, что параметр, передаваемый в empty(), не будет строкой, поэтому, когда вы передаете ему строковый объект, PHP не может узнать, что вы намеревались использовать строковый контекст, и неявное приведение не выполняется. Таким образом, вы просто проверяете, есть ли в переменной что-нибудь, что и есть — экземпляр объекта. Если вы хотите проверить его строковое значение, вам придется вручную привести его к виду empty((string) $actual).

Alex Howansky 06.08.2024 18:45

@AlexHowansky хорошие моменты. Я до определенного момента следовал логике. пустой ожидает/связывает входные данные с логическим значением. Тогда список вещей, которые привязаны к True в приведении типа bool, содержит «непустую строку» перед «любым объектом», но в коде они сначала проверяют объект :(

gcb 07.08.2024 04:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет. PHP этого не поддерживает.

Но вы можете определить интерфейс с помощью своего метода «isempty» и использовать его в своих классах.

interface IsEmpty {
   function isempty();
}

class YourClass implements IsEmpty {
    function isempty () {
        return false;
    }
}

Как вы хотите соблюдать значение toString? Может быть, вам нужно использовать обрезку() в вашей реализации YourClass .__toString()?

Спасибо. будет делать что-то в этом духе (пользовательский метод), но, вероятно, не будет использовать имя встроенного метода :) Я имею в виду, что если это собственный метод, я могу сделать вывод о большем значении со специализированным именем для рассматриваемого варианта использования вместо общего встроенный.

gcb 07.08.2024 04:07

Другие вопросы по теме