- Php true false значения
- Булев
- Синтаксис
- Преобразование в булев тип
- PHP 8.2: true, false и null как самостоятельные типы
- Различие между void и null
- Обнуляемость в null типе
- true тип не принуждает
- Использование true в объединенных типах
- Проверка избыточности с bool типом
- Не допускается союз true|false
- Использование true в типах пересечений
- true тип в ковариантности и контравариантности
- Php true false значения
Php true false значения
Much of the confusion about booleans (but not limited to booleans) is the fact that PHP itself automatically makes a type cast or conversion for you, which may NOT be what you want or expect. In most cases, it’s better to provide functions that give your program the exact behavior you want.
function boolNumber ( $bValue = false ) < // returns integer
return ( $bValue ? 1 : 0 );
>
function boolString ( $bValue = false ) < // returns string
return ( $bValue ? ‘true’ : ‘false’ );
>
$a = true ; // boolean value
echo ‘boolean $a AS string = ‘ . boolString ( $a ) . ‘
‘ ; // boolean as a string
echo ‘boolean $a AS number = ‘ . boolNumber ( $a ) . ‘
‘ ; // boolean as a number
echo ‘
‘ ;
$b = ( 45 > 90 ); // boolean value
echo ‘boolean $b AS string = ‘ . boolString ( $b ) . ‘
‘ ; // boolean as a string
echo ‘boolean $b AS number = ‘ . boolNumber ( $b ) . ‘
‘ ; // boolean as a number
echo ‘
‘ ;
$c = boolNumber ( 10 > 8 ) + boolNumber (!( 5 > 10 )); // adding booleans
echo ‘integer $c = ‘ . $c . ‘
‘ ;
?>
Results in the following being printed.
boolean $a AS string = true
boolean $a AS number = 1
boolean $b AS string = false
boolean $b AS number = 0
In other words, if we know what we want out of our program, we can create functions to accommodate. Here, we just wanted ‘manual control’ over numbers and strings, so that PHP doesn’t confuse us.
Булев
Это простейший тип. boolean выражает истинность значения. Он может быть либо TRUE , либо FALSE .
Синтаксис
Для указания boolean , используйте константы TRUE или FALSE . Обе они регистронезависимы.
Обычно, некоторый оператор возвращает boolean значение, которое потом передается управляющей конструкции.
// == это оператор, который проверяет
// эквивалентность и возвращает boolean
if ( $action == «show_version» ) echo «The version is 1.23» ;
>
?php
// это необязательно.
if ( $show_separators == TRUE ) echo «
\n» ;
>
// . потому что следующее имеет тот же самый смысл:
if ( $show_separators ) echo «
\n» ;
>
?>
Преобразование в булев тип
Для явного преобразования в boolean , используйте (bool) или (boolean). Однако, в большинстве случаев приведение типа необязательно, так как значение будет автоматически преобразовано, если оператор, функция или управляющая конструкция требует boolean аргумент.
При преобразовании в boolean , следующие значения рассматриваются как FALSE :
- само значение booleanFALSE
- integer 0 (ноль)
- float 0.0 (ноль)
- пустая строка, и строка «0»
- массив без элементов
- объект без полей (только для PHP 4)
- особый тип NULL (включая неустановленные переменные)
- Объекты SimpleXML, созданные из пустых тегов
Все остальные значения рассматриваются как TRUE (включая любой resource).
-1 рассматривается как TRUE , как и любое другое ненулевое (отрицательное или положительное) число!
var_dump ((bool) «» ); // bool(false)
var_dump ((bool) 1 ); // bool(true)
var_dump ((bool) — 2 ); // bool(true)
var_dump ((bool) «foo» ); // bool(true)
var_dump ((bool) 2.3e5 ); // bool(true)
var_dump ((bool) array( 12 )); // bool(true)
var_dump ((bool) array()); // bool(false)
var_dump ((bool) «false» ); // bool(true)
?>?php
PHP 8.2: true, false и null как самостоятельные типы
Еще в PHP 8.0 была добавлена поддержка Union Types, что позволило объявить тип как объединение двух или более типов. Он разрешал false, true и null, как один из возможных типов для объединенных типов, но запрещал их использование в качестве самостоятельных типов.
До версии PHP 8.2 можно было использовать null и только false только как части Union Types:
function foo(): string|null <>
function strpos(): int|false <>
Попытка использовать null, false, true типы как самостоятельные типы (т.е. не являющиеся частью объединенных типов) приводила к фатальной ошибке компиляции в версиях PHP PHP 8.0 и PHP 8.1:
Fatal error: Null can not be used as a standalone type in . on line .
Fatal error: False can not be used as a standalone type in . on line .
И приходилось использовать PhpDoc для предоставления более точной информации о возвращаемом типе:
class User extends Model
/**
* @return false
*/
public function isAdmin(): bool
return false;
>
>
Начиная с PHP 8.2 можно писать так и не будет ошибок:
class User extends Model
public function isAdmin(): false
return false;
>
>
false, true, null можно использовать как самостоятельный тип везде, где PHP принимает тип:
class Foo
private true $processed;
private false $focused;
public function process(string|int|true $value): true <>
public function focus(int|false $value): false <>
>
Это делает систему типов PHP более выразительной и полной, чтобы иметь возможность точнее объявлять типы возврата, аргумента и свойства.
Различие между void и null
Обратите внимание, что функции, объявленные с возвращаемым типом null, должны явно возвращать return null, иначе вызов функции приведет к исключению TypeError. Функции, которые не возвращают значение явно, либо из-за отсутствия оператора return, либо из-за отсутствия возвращаемого значения (return;), могут продолжать использовать тип void в качестве возвращаемого типа.
В следующем примере выдастся исключение TypeError, так как он должен был быть объявлен с void типом, а не null возвращаемым типом.
function foo(): null <>
foo();
TypeError: foo(): Return value must be of type null, none returned in .
Если возвращаемый тип не является null, то объявление функции с возвращаемым типом void или never является более подходящим подходом.
Обнуляемость в null типе
Если тип объявлен null, он не может быть помечен как «nullable» с помощью синтаксиса ?null, так как это приводит к избыточному объявлению типа. PHP выдает ошибку во время компиляции:
function doNotMakeSense(): ?null <>
Fatal error: null cannot be marked as nullable in . on line .
true тип не принуждает
Когда аргумент, свойство или возвращаемый тип объявлены как true, PHP не преобразует принудительно любой другой тип в true. Это имеет место быть, даже если в коде отключены строгие типы ( strict_types ) и даже для значений, которые в противном случае принудительно выполняются, как true в нестрогих сравнениях.
Например, следующий вызов функции не приводит целочисленное значение 1 к true, и в результате получается TypeError:
function foo(true $value) <>
foo(1);
TypeError: foo(): Argument #1 ($value) must be of type true, int given, called in . on line . and defined in .
Использование true в объединенных типах
true тип может использоваться как часть Union Types, если true тип не является избыточным, или использоваться вместе с типом false.
Ниже приведен пример объявления типа объединения, в котором используется true тип:
function sendEmail(true|string): true return true;
>
sendEmail(true);
Тип PHP bool по сути является объединенным типом true|false. Однако во избежание двусмысленности применяются два из следующих ограничений.
Проверка избыточности с bool типом
true тип нельзя использовать в сочетании с bool типом, потому что bool тип уже включает в себя true тип. Попытка объявить тип объединения bool приводит к фатальной ошибке компиляции:
function foo(true|bool $value) <>
Fatal error: Duplicate type true is redundant in . on line .
Не допускается союз true|false
Поскольку bool тип по сути такой же, как true|false, использование true|false в качестве типа объединения не допускается:
function foo(true|false $value) <>
Fatal error: Type contains both true and false, bool should be used instead in . on line .
Использование true в типах пересечений
true тип вообще нельзя использовать в типах пересечений . Тип пересечения с true типом приводит к ошибке компиляции:
function foo(true&false $value) <>
Fatal error: Type true cannot be part of an intersection type in . on line .
true тип в ковариантности и контравариантности
Тип true считается подтипом bool типа, и PHP также следует стандартным правилам ковариантности и контравариантности по отношению к true типу.
Пример ковариации bool, в котором возвращаемый тип заменяется true типом, а тип объединения сужается в подклассе.
class Foo public function test(): bool <>
public function test2(): string|true <>
>
class FooBar extends Foo public function test(): false <>
public function test2(): true <>
>
Пример контравариантности true, когда типизированный параметр в test() расширяется до bool типа, а тип объединения в test2() расширяется:
class Foo public function test(true $value): void <>
public function test2(true|string $value): void <>
>
class FooBar extends Foo public function test(bool $value): void <>
public function test2(true|string|int $value): void <>
>
Влияние обратной совместимости
До PHP 8.2 нельзя было использовать true, false и null как отдельные типы. PHP 8.2 и более поздние версии позволяют использовать их как самостоятельные типы, приложения с PHP ниже версии PHP 8.2, которым необходимо объявлять true , false и null типы, могут использовать комментарии PHPDoc для дополнительной точности и прибегать к использованию bool типа для совместимости со старыми версиями PHP:
/**
* @param true $value
* @return false
*/
function foo(bool $value): bool <>
Php true false значения
While waiting for native support for typed arrays, here are a couple of alternative ways to ensure strong typing of arrays by abusing variadic functions. The performance of these methods is a mystery to the writer and so the responsibility of benchmarking them falls unto the reader.
PHP 5.6 added the splat operator (. ) which is used to unpack arrays to be used as function arguments. PHP 7.0 added scalar type hints. Latter versions of PHP have further improved the type system. With these additions and improvements, it is possible to have a decent support for typed arrays.
function typeArrayNullInt (? int . $arg ): void >
function doSomething (array $ints ): void (function (? int . $arg ) <>)(. $ints );
// Alternatively,
( fn (? int . $arg ) => $arg )(. $ints );
// Or to avoid cluttering memory with too many closures
typeArrayNullInt (. $ints );
function doSomethingElse (? int . $ints ): void /* . */
>
$ints = [ 1 , 2 , 3 , 4 , null ];
doSomething ( $ints );
doSomethingElse (. $ints );
?>
Both methods work with all type declarations. The key idea here is to have the functions throw a runtime error if they encounter a typing violation. The typing method used in doSomethingElse is cleaner of the two but it disallows having any other parameters after the variadic parameter. It also requires the call site to be aware of this typing implementation and unpack the array. The method used in doSomething is messier but it does not require the call site to be aware of the typing method as the unpacking is performed within the function. It is also less ambiguous as the doSomethingElse would also accept n individual parameters where as doSomething only accepts an array. doSomething’s method is also easier to strip away if native typed array support is ever added to PHP. Both of these methods only work for input parameters. An array return value type check would need to take place at the call site.
If strict_types is not enabled, it may be desirable to return the coerced scalar values from the type check function (e.g. floats and strings become integers) to ensure proper typing.
same data type and same value but first function declare as a argument type declaration and return int(7)
and second fucntion declare as a return type declaration but return int(8).
function argument_type_declaration(int $a, int $b) return $a+$b;
>
function return_type_declaration($a,$b) :int return $a+$b;
>