Это обычно происходит при непосредственном использовании функции с empty
.
Пример:
if (empty(is_null(null))) {
echo 'empty';
}
Это связано с тем, что empty
- это языковая конструкция, а не функция, она не может быть вызвана с выражением в качестве аргумента в версиях PHP до 5.5. До PHP 5.5 аргумент empty()
должен быть переменной , но произвольное выражение (такое как возвращаемое значение функции) допустимо в PHP 5.5 +.
empty
, несмотря на его имя, на самом деле не проверяет, является ли переменная «пустой». Вместо этого он проверяет, существует ли переменная, или == false
. Выражения (например, is_null(null)
в примере) всегда будут считаться существующими, поэтому здесь empty
проверяет только, равен ли он false. Здесь вы можете заменить empty()
на !
, например. if (!is_null(null))
, или явно сравнить с ложным, например. if (is_null(null) == false)
.
Вопросы, относящиеся
(Для разработчиков C#, TryCast
подобно тому, "поскольку" и DirectCast
эквивалент нормального кастинга. Как Mike указал в комментариях, "поскольку" работы для nullable типов значения, но TryCast
не делает.)
, Если значение действительно должно быть T
, то DirectCast
действительно правильный способ пойти - он перестал работать быстро с соответствующей ошибкой.
TryCast
является соответствующим, когда законно для цели быть "неправильным" типом. Например, для получения всех Кнопочных управлений в контейнере Вы могли пройти набор управления и попытка для кастинга каждого для Нажимания на кнопку. Если это работает, Вы делаете что-то с ним - если это не делает, Вы идете дальше. (С LINQ можно просто использовать OfType
с этой целью, но Вы видите то, что я имею в виду...)
, По моему опыту, прямой кастинг является соответствующим чаще, чем TryCast
- хотя с дженериками я бросаю намного менее часто, чем я привык для так или иначе.
Единственная разница между этими двумя - то, что, TryCast
возвратит пустой указатель, если он перестанет работать, в то время как DirectCast
выдаст исключение.
Они имеют последствия о том, как можно обработать программу. Лично я предпочитаю не иметь необходимость выдать исключение, если возможность неподходящего броска (например, поля ввода текста для ввода данных пользователем, бросаемого в числовые типы), довольно высока.
Я думаю, что другие упомянули времена, когда Вы должны и не должны выполнять "безопасный кастинг" (где Вы удостоверяетесь, что бросок может успешно выполниться прежде, чем рискнуть исключением). Если Ваша программа действительно должна выполнить безопасный кастинг затем TryCast
, метод сохраняет и Вас и программу некоторая работа.
я не знал эти TryCast()
функция до сих пор, и я чувствую себя подобно дураку для использования 'плохого' метода безопасного броска.
, Если Вы не знали об эти TryCast()
функция затем, Вы могли бы закончить с чем-то вроде этого:
'' wasteful, the TypeOf and DirectCast calls are redundant
If TypeOf obj Is SomeClass Then
someObj = DirectCast(obj, SomeClass)
'' More code
End If
проблема состоит в том, что этот метод на самом деле выполняет два броска (технически, я думаю, что они - на самом деле проверки типа). Используя TryCast
и проверяющий, является ли результат Ничем, устраняет 2-й бросок и сохраняет бесполезную работу.
'' efficient, only one cast is ever performed and there are no InvalidCastExceptions thrown
someObj = TryCast(obj, SomeClass)
If someObj IsNot Nothing Then
'' More code
End If
После этого шаблона позволяет Вам избежать необходимости обрабатывать дорогие исключения и эффективно бросать к корректному типу.
Если Ваши мандаты дизайна, которые объект передал Вам , ДОЛЖНЫ быть типа T, затем утверждать (как в Отладке. Утверждайте), что бросок преуспевает в сборках отладки и выполняет исчерпывающие модульные тесты, чтобы доказать, что Ваша реализация следует за Вашим дизайном.
С Вашим дизайном, доказанным и протестированным, можно выполнить прямой бросок, знающий, что это никогда не может перестать работать.