关于PHP的类型

我自己介绍一下。

你好,我是日本系统开发株式会社的藤井。
在工作中经常使用PHP,我在努力学习,并将有用的内容整理成文章。
这些文章的内容大部分都可以在php.net上找到,但如果你觉得阅读文档很麻烦,
请一定利用这篇文章。

摘要

    • 各型の特徴、型の相互変換についてまとめています。

 

    • この記事のコードはPHP8.0で実行しています。

 

    どのOSでもPHPをインストールすれば実行できる内容になっています。

基本形式

存储一个值的四种标量类型。

名前表記概要論理値型bool真、偽(true、false)を格納する整数型int整数を格納する浮動小数点型float(double)小数を格納する文字列型string文字列を格納する

包含四个不同类型的复合型(可以存储一个以上复合型值的标量型)。

名前表記概要配列array各値を特定の情報(文字列など)に紐づけて格納するオブジェクトobject各値と動作を格納する呼び出し可能callable呼び出し可能であることを表す繰り返し可能iterable繰り返し可能であることを表す

两种特殊类型

名前表記概要リソースresourcephp外部のデータを管理するヌルNULL(null)値が存在しないことを表す

对各种类型进行解释

针对每种类型,将提供说明和代码示例。
代码示例是在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) "バスケットボール"
}'

引用

 

广告
将在 10 秒后关闭
bannerAds