ctype not всегда возвращает false для целочисленного типа.
foreach(range(-1000 , 1000)as $num){
if(ctype_digit($num)){
echo $num . ", ";
}
}
ctype_digit возвращает true для следующего целочисленного номера типа.
-78, -77, -71,48,49,50,51,52,53,54,55,56,57,178,179,185,
256,257,258,259,260,261,262,263,264,265,266,267,268,269,270 до 1000
основная практика состоит в том, чтобы вводить каждое число в строку e.q. strval ($ num) или (String) $ num
в этом случае отрицательное значение (-78) всегда будет возвращать ложь.
is_int вернет вам true для значения типа int в диапазоне от -2147483647 до 2147483647.
любое значение, превышающее это число, вернет вам ложь, если оно работает в 32-битной системе.
на 64 битах он может доходить до диапазона от -9223372036854775807 до 9223372036854775807
в плане производительности лично очень сложно сказать. ctype_digit может быть быстрее, чем is_int, но если вам нужно привести каждое значение к строковой, производительность в целом снижается.