Есть ли способ перегрузить логику пустой() для пользовательских классов на 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
для объекта, а не просто поля?
Не удалось найти ничего в руководстве, но я также трачу много времени на просмотр перегрузок свойств, прежде чем узнал, что перегрузки классов называются «магическими» методами, поэтому, возможно, я просто упускаю правильную номенклатуру...
empty
в конце проводит тест на правдивость. Итак, вопрос сводится к следующему: можете ли вы изменить истинность (логическое значение) пользовательского класса? На что ответ: нет.
Ожидается, что параметр, передаваемый в empty()
, не будет строкой, поэтому, когда вы передаете ему строковый объект, PHP не может узнать, что вы намеревались использовать строковый контекст, и неявное приведение не выполняется. Таким образом, вы просто проверяете, есть ли в переменной что-нибудь, что и есть — экземпляр объекта. Если вы хотите проверить его строковое значение, вам придется вручную привести его к виду empty((string) $actual)
.
@AlexHowansky хорошие моменты. Я до определенного момента следовал логике. пустой ожидает/связывает входные данные с логическим значением. Тогда список вещей, которые привязаны к True в приведении типа bool, содержит «непустую строку» перед «любым объектом», но в коде они сначала проверяют объект :(
Нет. PHP этого не поддерживает.
Но вы можете определить интерфейс с помощью своего метода «isempty» и использовать его в своих классах.
interface IsEmpty {
function isempty();
}
class YourClass implements IsEmpty {
function isempty () {
return false;
}
}
Как вы хотите соблюдать значение toString? Может быть, вам нужно использовать обрезку() в вашей реализации YourClass .__toString()?
Спасибо. будет делать что-то в этом духе (пользовательский метод), но, вероятно, не будет использовать имя встроенного метода :) Я имею в виду, что если это собственный метод, я могу сделать вывод о большем значении со специализированным именем для рассматриваемого варианта использования вместо общего встроенный.
Некоторые эксперты считают, что использование пустой логики PHP — плохая практика: dev.to/klnjmm/never-use-empty-function-in-php-4pb0