概要
PHP は 8 つのプリミティブ データ型をサポートします
4 つのスカラー型:
boolean(布尔型)integer(整型)float(浮点型,也称作 double)string(字符串)
2 つの複合型:
array(数组)object(对象)
最後に 2 つの特別な型:
resource(资源)NULL(无类型)
実際には double と float は同じです。歴史的な理由により、これらは2 つの名前が同時に存在します。
変数の型は通常、プログラマによって設定されるのではなく、変数が使用されるコンテキストに基づいて実行時に PHP によって決定されます。
変数の型を検出するvar_dump() は変数に関する関連情報を出力する
gettype() は変数の型を取得する
<?phpclass foo {}function fn () {}$a = true;$b = 2;$c = 3.2;$d = 'hello';$e = ['a', 'b'];$f = new foo;var_dump($a); // bool(true)var_dump($b); // int(2)var_dump($c); // float(3.2)var_dump($d); // string(7) "hello"var_dump($e); // array(2) { [0]=> string(1) "a" [1]=> string(1) "b" }var_dump($f); // object(foo)#1 (0) { }var_dump(fn); // string(2) "fn"echo '<br>';echo gettype($a); // booleanecho gettype($b); // integerecho gettype($c); // doubleecho gettype($d); // stringecho gettype($e); // arrayecho gettype($f); // objectecho gettype(fn); // string?>
返される文字列は変更する必要がある可能性があるため、特定の型をテストするために gettype() を使用しないでください将来のバージョン。さらに、文字列比較が含まれるため、実行速度が遅くなります。 代わりに is_* 関数を使用してください
is_bool()is_integer()is_float()is_numeric()is_string()is_scalar() is_array()is_object()is_resource()is_null()function_exists() // 函数是否存在method_exists() // 某对象的方法是否存在
TRUE と FALSE は大文字と小文字を区別しません
自動型変換が boolean の場合、次の値は FALSE とみなされます
布尔值 FALSE 本身整型值 0(零)浮点型值 0.0(零)空字符串,以及字符串 "0"不包括任何元素的数组不包括任何成员变量的对象(仅 PHP 4.0 适用)特殊类型 NULL(包括尚未赋值的变量)从空标记生成的 SimpleXML 对象
To use 8 進表現の場合は、数値の前に 0 (ゼロ) を追加する必要があります
16 進表現を使用するには、数値の前に 0x を追加する必要があります
2 進表現を使用するには、数値の前に 0b を追加する必要があります
PHP 5.4 以降では、2 進表現の場合は整数.0 現在利用可能です
整数の語長はプラットフォームに依存しますが、通常の最大値は約 20 億 (32 ビット符号付き) です。 64 ビット プラットフォームでの最大値は通常約 9E18 です
PHP は符号なし整数をサポートしていません
整数 値の語長は定数 PHP_INT_SIZE で表すことができます。PHP 4.4.0 および PHP 5.0.5 以降、最大値は 9E18 です。値は定数 PHP_INT_MAX で表すことができます。
指定された数値が整数の範囲を超える (つまり、整数オーバーフローが発生する) 場合、浮動小数点として解釈されます。同様に、演算結果が整数の範囲を超える場合も float を返します
ブール値からの変換
FALSE は 0 (ゼロ)、TRUE は 1 (1) を生成します
浮動小数点からの変換
浮動小数点から整数への変換の際、切り捨てとなります。
文字列から変換
文字列に「.」、「e」、または「E」が含まれておらず、その数値が整数型(PHP_INT_MAX で定義されている)の範囲内にある場合、文字列は次のように使用されます値を取得するための整数。それ以外の場合はすべて、値は浮動小数点数として扱われます。
<?php$foo = 1 + "10.5"; // $foo is float (11.5)$foo = 1 + "-1.3e3"; // $foo is float (-1299)$foo = 1 + "bob-1.3e3"; // $foo is integer (1)$foo = 1 + "bob3"; // $foo is integer (1)$foo = 1 + "10 Small Pigs"; // $foo is integer (11)$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)$foo = "10.0 pigs " + 1; // $foo is float (11)$foo = "10.0 pigs " + 1.0; // $foo is float (11) ?>
浮動小数点数の語長はプラットフォーム依存
0.1や0.7など10進法で正確に表現できる有理数は、仮数部がいくらあっても正確に表現できない内部で使用されるバイナリ システムによって表現されるため、1 つを失わずに表現することはできません。 ポイントツーポイント精度でバイナリ形式に変換します。これは、混乱を招く結果につながる可能性があります。たとえば、floor((0.1+0.7)*10) は、通常、結果の内部表現が実際には 7.9999999999999991118 のようなものであるため、期待される 8 ではなく 7 を返します…
したがって、浮動小数点の結果を決して信頼しないでください。最後の桁まで正確であり、2 つの浮動小数点数が等しいかどうかを比較することはありません
本当に高い精度が必要な場合は、任意精度の数学関数または GMP 関数を使用する必要があります。
特定の数学演算は、定数 NAN で表される結果を生成します。この結果は、浮動小数点演算で未定義または表現できない値を表します
NAN は、それ自体を含む他の値と比較すべきではなく、is_nan() を使用してチェックする必要があります
文字列 String文字列は 4 つの方法で表現できます
单引号双引号heredoc 语法结构nowdoc 语法结构(自 PHP 5.3.0 起)
文字文字列内の文字列は、0 から始まり、対応する数値を含める配列構造と同様の角かっこを使用する添字によってアクセスおよび変更できます
Heredoc の構造は、二重引用符のない二重引用符で囲まれた文字列のようなものです
最後に引用された識別子は行の最初の列にある必要があり、識別子の命名は他のタグと同じ PHP ルールに従う必要があります。文字、数字、アンダースコアのみを含めることができ、文字と文字で始まる必要があります。アンダースコア。
$str = <<<EODExample of stringspanning multiple linesusing heredoc syntax.EOD;
Nowdoc 構造は一重引用符のない一重引用符付き文字列のようなものです
$str = <<<'EOD'Example of stringspanning multiple linesusing nowdoc syntax.EOD;
文字列が一重引用符 (') で囲まれている場合、一重引用符 (') とバックスラッシュのみをエスケープできます ()
文字列の場合二重引用符 (") で囲まれている場合、PHP は次の特殊文字を解析します
\n | 换行(ASCII 字符集中的 LF 或 0x0A (10)) |
\r | 回车(ASCII 字符集中的 CR 或 0x0D (13)) |
\t | 水平制表符(ASCII 字符集中的 HT 或 0x09 (9)) |
\v | 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起) |
\e | Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起) |
\f | 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起) |
\\ | 反斜线 |
\$ | 美元标记 |
\” | 双引号 |
\[0-7]{1,3} | 符合该正则表达式序列的是一个以八进制方式来表达的字符 |
\x[0-9A-Fa-f]{1,2} | 符合该正则表达式序列的是一个以十六进制方式来表达的字符 |
和单引号字符串一样,转义任何其它字符都会导致反斜线被显示出来
由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别,不能有空格,且必须用双引号包围(不能用在双引号之外)
$x = 'hello';$y = 'world';$str = "Hi, {$x}";// $str = 'Hi, {$x}'; // 无效// $str = "Hi, {$x}" . {$y}; // 无效
一个布尔值 boolean 的 TRUE 被转换成 string 的 “1”。Boolean 的 FALSE 被转换成 “”(空字符串)
一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string(包括 float 中的指数部分)
数组 array 总是转换成字符串 “Array”,因此,echo 和 print 无法显示出该数组的内容
Object不能转换成字符串,自 PHP 5 起,适当时可以用 __toString 方法
http://php.net/manual/zh/ref.strings.php
字符串会被按照该脚本文件相同的编码方式来编码。操作文本的函数必须假定字符串是如何编码的,不幸的是,PHP 关于此的函数有很多变种
某些函数假定字符串是以单字节编码的,但并不需要将字节解释为特定的字符。例如 substr(),strpos(),strlen() 和 strcmp()。理解这些函数的另一种方法是它们作用于内存缓冲区,即按照字节和字节下标操作。
某些函数被传递入了字符串的编码方式,也可能会假定默认无此信息。例如 htmlentities() 和 mbstring 扩展中的大部分函数。
其它函数使用了当前区域(见 setlocale()),但是逐字节操作。例如 strcasecmp(),strtoupper() 和 ucfirst()。这意味着这些函数只能用于单字节编码,而且编码要与区域匹配。例如 strtoupper(“á”) 在区域设定正确并且 á 是单字节编码时会返回 “Á”。如果是用 UTF-8 编码则不会返回正确结果,其结果根据当前区域有可能返回损坏的值。
最后一些函数会假定字符串是使用某特定编码的,通常是 UTF-8。intl 扩展和 PCRE(上例中仅在使用了 u 修饰符时)扩展中的大部分函数都是这样。尽管这是由于其特殊用途,utf8_decode() 会假定 UTF-8 编码而 utf8_encode() 会假定 ISO-8859-1 编码。
要书写能够正确使用 Unicode 的程序依赖于很小心地避免那些可能会损坏数据的函数,必要时使用mbstring扩展的多字节字符串函数。
Resource 资源类型资源 resource 是一种特殊变量,保存了到外部资源的一个引用,如打开文件、数据库连接、图形画布区域等的特殊句柄
由于 PHP 4 Zend 引擎引进了引用计数系统,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。
持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。
将其它类型的值转换为资源没有意义。
NULL特殊的 NULL 值表示一个变量没有值。NULL 类型只有一个值,就是不区分大小写的常量 NULL。
在下列情况下一个变量被认为是 NULL:
被赋值为 NULL。尚未被赋值。被 unset()。
允许的强制转换有
(int), (integer) - 转换为整形 integer(bool), (boolean) - 转换为布尔类型 boolean(float), (double), (real) - 转换为浮点型 float(string) - 转换为字符串 string(array) - 转换为数组 array(object) - 转换为对象 object(unset) - 转换为 NULL (PHP 5)
使用settype()函数
// 可以设置的type类型如下“boolean” (或为“bool”,从 PHP 4.2.0 起)“integer” (或为“int”,从 PHP 4.2.0 起)“float” (只在 PHP 4.2.0 之后可以使用,对于旧版本中使用的“double”现已停用)"string""array""object"“null” (从 PHP 4.2.0 起)
还有一些类型转换的函数boolval()、intval()、floatval()、strval()
版权声明:本文为博主原创文章,未经博主允许不得转载。