关于PHP的类型
我自己介绍一下。
你好,我是日本系统开发株式会社的藤井。
在工作中经常使用PHP,我在努力学习,并将有用的内容整理成文章。
这些文章的内容大部分都可以在php.net上找到,但如果你觉得阅读文档很麻烦,
请一定利用这篇文章。
摘要
-
- 各型の特徴、型の相互変換についてまとめています。
-
- この記事のコードはPHP8.0で実行しています。
- どのOSでもPHPをインストールすれば実行できる内容になっています。
基本形式
存储一个值的四种标量类型。
包含四个不同类型的复合型(可以存储一个以上复合型值的标量型)。
两种特殊类型
对各种类型进行解释
针对每种类型,将提供说明和代码示例。
代码示例是在php -a的交互模式下执行的。
代码示例以php >开头的行为php执行代码,
其他行为前一行的执行结果。(用双引号括起来)
变量在前面加上$符号,而常量则不需要。
布尔
解释
存储真或假其中之一。
真用true(TRUE)来表示,假用false(FALSE)来表示。
不区分大小写。
代码 (Mandarin Chinese: “”)
php > $trueData = true;
php > echo gettype($trueData);
"boolean"
php > $falseData = false;
php > echo gettype($falseData);
"boolean"
请用中文进行本地化解释。
解释
可以使用十进制、二进制、八进制、十六进制的表示法进行存储。
也可以附加符号(+或-)。
二进制以0b开头,八进制以0(在php8.1.0后也可以使用0o),十六进制以0x开头进行表示。
PHP不支持无符号整数,整数的大小(字节数)由常量PHP_INT_SIZE确定,整数的最大值由常量PHP_INI_MAX存储,整数的最小值由常量PHP_INI_MIN存储。
最大値、最小値を超えた整数を格納した場合、浮動小数点型になる。
代码 (Mandarin: mǎ)
整数的存储
php > $decimal = 50;
php > echo "型:".gettype($decimal), ", 値:".$decimal;
"型:integer, 値:50"
php > $binary = 0b110010;
php > echo "型:".gettype($binary), ", 値:".$binary;
"型:integer, 値:50"
php > $octal = 062;
php > echo "型:".gettype($octal), ", 値:".$octal;
"型:integer, 値:50"
php > $hexadecimal = 0x32;
php > echo "型:".gettype($hexadecimal), ", 値:".$hexadecimal;
"型:integer, 値:50"
整数的大小、最大值、最小值
php > echo "サイズ:". PHP_INT_SIZE ."バイト, ", "最大値:". PHP_INT_MAX .", ", "最小値:". PHP_INT_MIN;
"サイズ:8バイト, 最大値:9223372036854775807, 最小値:-9223372036854775808"
超过整数的最大值和最小值的值存储
php > $intBitSize = PHP_INT_SIZE * 8;
php > $intMax = 2 ** ($intBitSize - 2) + (2 ** ($intBitSize - 2) - 1);
php > echo "型:".gettype($intMax), ", 値:".$intMax;
"型:integer, 値:9223372036854775807" // PHP_INT_SIZEによって変わります
php > $intMax += 1;
php > echo "型:".gettype($intMax), ", 値:".$intMax;
"型:double, 値:9.2233720368548E+18" // PHP_INT_SIZEによって変わります
php > $intMin = (-2) ** ($intBitSize - 1); //-より**の優先順位が高いため()を使用
php > echo "型:".gettype($intMin), ", 値:".$intMin;
"型:integer, 値:-9223372036854775808" // PHP_INT_SIZEによって変わります
php > $intMin = $intMin - 1;
php > echo "型:".gettype($intMin), ", 値:".$intMin;
"型:double, 値:-9.2233720368548E+18" // PHP_INT_SIZEによって変わります
float(double)
解释
小数を格納します。
指数表記でも格納できます。指数表記の場合、eの後に符号を付けて指数を表現します。
gettypeの結果はdoubleになります。
代码 mǎ)
php > $floatData = 1.001;
php > echo "型:".gettype($floatData), ", 値:".$floatData;
"型:double, 値:1.001"
php > $exponentPlus = 1e2;
php > $exponentMinus = 1e-2;
php > echo "型:".gettype($exponentPlus), ", 値:".$exponentPlus;
"型:double, 値:100"
php > echo "型:".gettype($exponentMinus), ", 値:".$exponentMinus;
"型:double, 値:0.01"
string
説明
文字列は4つの方法で格納できます。
-
- 引用符
-
- 二重引用符
-
- ヒアドキュメント構文
- Nowdoc構文
引用符は’を意味し、’の始まりから終わりまでを文字列として格納します。
特殊な動作として、文字列に’を含めたい場合は\でエスケープします。(\’)
同様に、文字列に\を含めたい場合は\でエスケープします。(\\)
\’、\\以外の\はそのまま格納されます。
二重引用符は”を意味し、引用符とほぼ同じ解釈をします。
“、\は同様にエスケープを必要とし、エスケープ以外の\はそのまま格納されます。
詳細はドキュメントを閲覧ください。
改行コード、水平タブなど特殊な解釈をする文字列も存在します。
引用符和双引号都可以存储多行字符串。(存储从引用符或双引号开始到结束的部分。)
ヒアドキュメント構文は、<<<IDの形式で記述します。
“`<<<`以後の文字列が終端IDとなり、終端IDまでのすべての文字列を格納します。
文字列の解釈は二重引用符と同様です。
Nowdoc構文は、<<<‘ID’の形式で記述します。
構文は終端IDを引用符で囲むこと以外同じですが、文字列を解釈しません。
つまり、\\はそのまま\\として格納されます。
在中文中有两种方法可以解释字符串内的变量:双引号和Here Document语法。
代码 (daima)
引号
php > $aiueo = 'aiueo';
php > echo $aiueo;
"aiueo"
php > $escSinglequote = 'I\'m human.';
php > echo $escSinglequote;
"I'm human."
php > $escBackslash = 'C:\\Program Files';
php > echo $escBackslash;
"C:\Program Files"
php > $notEscBackslash = 'C:\Program Files';
php > echo $notEscBackslash;
"C:\Program Files"
php > $multiLine = 'aiueo
php > kakikukeko';
php > echo $multiLine;
"aiueo
kakikukeko"
双引号
php > $aiueo = "aiueo";
php > echo $aiueo;
"aiueo"
php > $escDoublequote = "\" is double quotation mark.";
php > echo $escDoublequote;
'" is double quotation mark.'
Here is one option to paraphrase the given phrase in Chinese:
多行字符串语法
php > $heredoc = <<<EOF
php > a i u e o
php > ka ki ku ke ko
php > EOF;
php > echo $heredoc;
"a i u e o
ka ki ku ke ko"
新文档结构
php > $newdoc = <<<'EOF'
php > 1 2 3 4 5
php > a b c d e
php > EOF;
php > echo $newdoc;
"1 2 3 4 5
a b c d e"
变量的解释 de
php > $dayOfWeek = '水曜日';
php > $parseVariable = "今日は${dayOfWeek}です。";
php > echo $parseVariable;
"今日は水曜日です。"
array
解释
这是一种可以存储多个值的类型。对于每个值,它们可以与数字或字符串绑定并存储。
在中文中,可以这样表达:
数组可以通过[]创建。
如果将每个数据与数字关联存储,则可以使用[‘data’]或[0 => ‘data’]。
如果将每个数据与字符串关联存储,则可以使用[‘sample’ => ‘data’]创建。
如果只使用值来创建数组([‘data’]),值将按照0,1,2…的数字与其关联。
取得数据的方法是通过指定数字或字符串来进行。
为了输出Array,我们使用了print_r函数。
请参阅文档以获取更多详细信息。若将true作为第二个参数传递,则会返回字符串。
代码
将数字与存储相关联
php > $fruit = ['apple', 'blueberry', 'cherry'];
php > echo "型:".gettype($fruit), ", 値:". print_r($fruit, true);
"型:array, 値:Array
(
[0] => apple
[1] => blueberry
[2] => cherry
)"
php > $fruitNum = [0 => 'apple', 1 => 'blueberry', 2 => 'cherry'];
php > echo "型:".gettype($fruitNum), ", 値:". print_r($fruitNum, true);
"型:array, 値:Array
(
[0] => apple
[1] => blueberry
[2] => cherry
)"
php > echo $fruit[0];
"apple"
php > echo $fruitNum[0];
"apple"
将数据存储和字符串相关联
php > $monthJa = ['january' => '1月', 'february' => '2月', 'march' => '3月'];
php > echo "型:".gettype($monthJa), ", 値:". print_r($monthJa, true);
"型:array, 値:Array
(
[january] => 1月
[february] => 2月
[march] => 3月
)"
php > echo $monthJa['january'];
"1月"
物体 (wù tǐ)
讲解
對於能夠存儲多個值的數組而言,物件可以存儲多個值和動作。
本次將使用stdClass作為物件的基礎。
在中文中,我们可以将其重新表达为:
我们使用”new”来创建对象。
我们使用”->”来存储值。在获取值时也使用”->”。
程式碼
php > $stdobject = new stdClass();
php > $stdobject->cpu = 'intel i7';
php > $stdobject->memory = '8GB';
php > $stdobject->storage = '1TB';
php > echo 'CPU:' .$stdobject->cpu;
"CPU:intel i7"
php > echo 'MEMORY:' .$stdobject->memory;
"MEMORY:8GB"
php > echo 'STORAGE:' .$stdobject->storage;
"STORAGE:1TB"
php > echo "型:".gettype($stdobject), ", 値:". print_r($stdobject, true);
"型:object, 値:stdClass Object
(
[cpu] => intel i7
[memory] => 8GB
[storage] => 1TB
)"
可调用的 (kě de)
解釋
不允许创建callable变量,只能在类型声明中使用,这表示它是一个函数。
可迭代
解释
可以重复使用,表示有这样的能力。与callable相同,无法创建iterable变量,它在类型声明中使用。
资源
解释
这是一个用于保存外部资源的类型。外部资源指的是文件等。
可以使用特殊函数来创建资源类型。
当关闭资源引用时,gettype的返回值会附加(closed)。
代码 (daima)
php > $file = fopen('sample.txt', 'w+');
php > fwrite($file, "hello world". PHP_EOL);
php > fwrite($file, "Hello World!!". PHP_EOL);
php > rewind($file); //書き込み後、読み込むためにファイルポインタを先頭に戻します
php > echo fgets($file);
php > echo fgets($file);
php > echo "型:".gettype($file), ", 値:". print_r($file, true);
"型:resource, 値:Resource id #2"
php > fclose($file);
php > echo "型:".gettype($file), ", 値:". print_r($file, true);
"型:resource (closed), 値:Resource id #2"
空
解释
null型表示一个变量不具有值。
null类型只能具有null值,并且不区分大小写。
当变量满足以下三种情况时,被视为空值:”null”。
-
- 定数nullが代入されている
-
- まだ値が何も代入されていない
- unset()されている
変数がnullとみなされるかは、is_null関数を使用して確認できます。
is_null関数は変数がnullとみなされる場合、trueをそれ以外はfalseを返します。
値が何も代入されていない変数、unset()された変数は存在しなくなり、アクセスできなくなります。
グローバルスコープで使用可能なすべての変数を保持する、$GLOBALSを使用し、挙動を確認します。
代码 (Mandarin Chinese: ” mǎ”)
php > $displayKeys = ['sample' => 0, 'none' => 1, 'nothing' => 2]; // 今回使用する変数名
php > $sample = 'sample';
php > var_export(is_null($sample));
"false"
php > print_r(array_intersect_key($GLOBALS, $displayKeys));
"Array
(
[sample] => sample
)"
php > $none;
php > var_export(is_null($none)); // 変数が存在しないため、警告がでます。
"true"
php > print_r(array_intersect_key($GLOBALS, $displayKeys)); // noneは存在しません。
"Array
(
[sample] => sample
)"
php > $nothing = null;
php > var_export(is_null($nothing));
"true"
php > print_r(array_intersect_key($GLOBALS, $displayKeys)); // nothingは値を代入しているため、存在します。
"Array
(
[sample] => sample
[nothing] =>
)"
php > unset($sample); // 変数の
php > var_export(is_null($sample)); // unsetで変数sampleが存在しなくなったため、警告がでます。
"true"
php > print_r(array_intersect_key($GLOBALS, $displayKeys)); // sampleはunsetで削除されています。
"Array
(
[nothing] =>
)"
类型转换
通过将类型的名称添加到变量的开头,可以相互转换。
(string) 0 将变为字符串的0。
为了强制将传递的值转换为字符串,这里我们将使用var_dump函数来直接输出值的内容。
スカラー型から複合型への変換
解释
将标量类型(bool、int、float、string)转换为复合类型(array、object)时,执行相同的操作。
スカラー型をarrayに変換すると、スカラー型の値を先頭に格納した配列に変わります。
スカラー型をobjectに変換すると、スカラー型の値をscalarプロパティに格納したオブジェクト(stdClass)に変わります。
代码 (daima)
php > $intOne = 1;
php > var_dump((array)$intOne);
'array(1) {
[0]=>
int(1)
}'
php > var_dump((object)$intOne);
'object(stdClass)#1 (1) {
["scalar"]=>
int(1)
}'
布尔
说明
bool→int
trueが1にfalseが0に変換されます。
bool→float
trueが1.0にfalseが0.0に変換されます。
bool→string
trueが文字列の1にfalseが空文字列に変換されます。
这是一个日语的词汇,意思是”代码”。
php > $boolTrue = true;
php > $boolFalse = false;
php > var_dump((int)$boolTrue);
"int(1)"
php > var_dump((int)$boolFalse);
"int(0)"
php > var_dump((float)$boolTrue);
"float(1)"
php > var_dump((float)$boolFalse);
"float(0)"
php > var_dump((string)$boolTrue);
'string(1) "1"'
php > var_dump((string)$boolFalse);
'string(0) ""'
要求用中文将以下内容进行改述,只需给出一种选择:
int
解释
将整数类型转换为布尔类型:
0将被转换为假(false)。
除了0之外的其他整数将被转换为真(true)。
int→float
浮動小数点表現に変換されます。(0 → 0.0)
将整数转换为字符串表达。 (10 → “10”)
代码
php > $intBoolZero = 0;
php > $intBoolNonZero = 15;
php > var_dump((bool)$intBoolZero);
"bool(false)"
php > var_dump((bool)$intBoolNonZero);
"bool(true)"
php > $intFloat = 0;
php > var_dump((float)$intFloat);
"float(0)"
php > $intString = 10;
php > var_dump((string)$intString);
'string(2) "10"'
浮点数 (双精度)
阐述
将float转换为bool类型。0.0和-0.0将转换为false。其他值将转换为true。
将浮点数转换为整数时,小数部分将被舍弃。
浮点数会转换为字符串表示(1.0 → “1.0”)。
请将以下内容用中文进行表达(仅需要一个选项):
コード
php > $floatBoolZero = 0.0;
php > $floatBoolNonZero = 2.0;
php > var_dump((bool)$floatBoolZero);
"bool(false)"
php > var_dump((bool)$floatBoolNonZero);
"bool(true)"
php > $floatInt = 1.5;
php > var_dump((int)$floatInt);
"int(1)"
php > $floatString = 3.5;
php > var_dump((string)$floatString);
'string(3) "3.5"'
string
解释
字符串→布尔值
空字符串以及字符串中的0将被转换为false。(字符串中的0被转换为false是PHP的特殊行为。)
其他情况被转换为true。
将字符串转换为整数。如果值的格式为数字形式,则转换为对应数字的整数表示(对于小数,小数点后面将被舍去)。如果不是数字格式,则转换为0。
字符串→浮点数
与整数一样,如果值是数值格式,它将被转换为对应数值的浮点表示法。(对于整数,它将变为小数。)
代码 (Mandarin Chinese: mǎ)
php > $stringBoolEmpty = "";
php > $stringBoolZero = "0";
php > $stringBoolTrue = "12";
php > var_dump((bool)$stringBoolEmpty);
"bool(false)"
php > var_dump((bool)$stringBoolZero);
"bool(false)"
php > var_dump((bool)$stringBoolTrue);
"bool(true)"
php > $stringIntNum = "10";
php > $stringIntFloat = "10.5";
php > $stringIntNotNum = "aiu";
php > var_dump((int)$stringIntNum);
"int(10)"
php > var_dump((int)$stringIntFloat);
"int(10)"
php > var_dump((int)$stringIntNotNum);
"int(0)"
php > $stringFloatDouble = "1.7";
php > $stringFloatNum = "1";
php > $stringFloatNotNum = "float";
php > var_dump((float)$stringFloatDouble);
"float(1.7)"
php > var_dump((float)$stringFloatNum);
"float(1)"
php > var_dump((float)$stringFloatNotNum);
"float(0)"
複合型同士的歸還
解释
数组→对象
数组的键和值分别成为对象(stdClass)的属性和属性值。
请参考以下文档。一般情况下,每个属性和值都会成为数组的键和值。
但是有一些例外情况,例如根据属性的访问权限来改变键的值,以及未初始化的类型属性可能会被删除。
代码
php > $game = ['darts', 'bowling', 'table-tennis' => '卓球'];
php > var_dump((object)$game);
'object(stdClass)#1 (3) {
["0"]=>
string(5) "darts"
["1"]=>
string(7) "bowling"
["table-tennis"]=>
string(6) "卓球"
}'
php > $sportObj = new stdClass();
php > $sportObj->soccer = 'サッカー';
php > $sportObj->baseball = '野球';
php > $sportObj->basketball = 'バスケットボール';
php > var_dump((array)$sportObj);
'array(3) {
["soccer"]=>
string(12) "サッカー"
["baseball"]=>
string(6) "野球"
["basketball"]=>
string(24) "バスケットボール"
}'
引用