三陸牡蠣復興支援プロジェクト「SAVE SANRIKU OYSTER」



ここまでのサンプルで、「"HODENASU"」等の「文字列」や「2」等の「数値」、『「true」と「false」』の「真偽値」が登場しました。これらはいずれも具体的な「値」ですが、種類が違います。この、種類の違いは、「」と呼ばれるものの違いです。

型とは

「"HODENASU"」は「文字列」であり、「2」は「数値」、『「true」と「false」』は「真偽値」です。で、プログラムの中では、文字列は文字列として扱われ、数値は数値として扱われ、真偽値は真偽値として扱われます。文字列が文字列として扱われるには、その値が文字列であると認識されていなければならないわけで。まず、以前書いたサンプルを見ると、「echo "  <em>hello,HODENASU!!</em>";」という一文があります。この中の「"  <em>hello,HODENASU!!</em>"」の部分は「文字列」だと見れば判ります。PHPスクリプトを解釈するサーバのPHPエンジンも判ります。何故か?それは、「"(ダブルクォーテーション)」で囲んであるからです。「"(ダブルクォーテーション)」で囲んであるものが「文字列」であると解釈されます。この、文字列という種類、つまり型を、「文字列型」と言います。また、「"(ダブルクォーテーション)」ではなく、「'(シングルクォーテーション)」で囲んでも「文字列型」と解釈されます。しかし、「"(ダブルクォーテーション)」で囲んだ場合と、「'(シングルクォーテーション)」で囲んだ場合では、その意味がちょっと変わってきますが、それは後で解説。

型の種類

PHPがサポートする型は、次の8種類です。

  • 文字列型(string)
  • 整数型(integer)
  • 浮動小数点数型(float もしくは double(どっちでもいい))
  • 論理値(真偽値)型(boolean)
  • 配列型(array)
  • オブジェクト型(object)
  • リソース型(resource)
  • ヌル型(NULL)

文字列型(string)

文字列は、二重引用符「"(ダブルクォーテーション)」もしくは引用符「'(シングルクォーテーション)」で囲む書き方があり、そしてどちらで囲んだかによって意味がちょっと変わると書きましたが、この2つの書き方の他にもう1つ、「ヒアドキュメント構文」という書き方があります。では、引用符の場合と二重引用符の場合の違いと、「ヒアドキュメント構文」について解説致します。

引用符「'(シングルクォーテーション)」

以下のサンプルをご覧下さい。

<html>
<body>
<p>
<?php
    $hode = 'TEST1';
    $nasu = 'TEST2';
    
    echo 'hello, HODENASU!!';
    echo '<hr />';
    echo 'hello, "HODENASU!!"';
    echo '<hr />';
    echo 'hello, I\'m a HODENASU!!';
    echo '<hr />';
    echo 'hello, \ HODENASU!! \\';
    echo '<hr />';
    echo 'hello, HODENASU!! \r\n Good Bey';
    echo '<hr />';
    echo 'hello, HODENASU!! $hode $nasu';
?>
</p>
</body>
</html>

結果は以下の通りです。

hello, HODENASU!!

hello, "HODENASU!!"
hello, I'm a HODENASU!!
hello, \ HODENASU!! \
hello, HODENASU!! \r\n Good Bey
hello, HODENASU!! $hode $nasu

1つ目の出力は、ごく普通の出力です。

2つ目の出力では、文字列中に二重引用符がありますがこの場合、二重引用符は特に特別な意味を持つわけではないのでそのまま出力されます。

3つ目の出力では、引用符を出力しようという所ですが、引用符で囲まれた文字列中に引用符をそのまま書いてしまっては、そこで文字列の終わりと解釈されてしまうので、これを避けるために、引用符の前に「\(バックスラッシュ(OSの設定によっては、円マーク))」を付けます。すると、「\'」は、文字列の「'」として出力されます。この機能を「エスケープ」と言い、「\」を、「エスケープシーケンス」と言います。

4つ目の出力では、「\」を出力しようという所ですが、「\」の後ろに特別な意味を持つ記号や文字が来なければ、そのまま記述すれば出力されますが、「\」の後ろに「'」が来る場合は、「\\」のように連続して書く必要があります。

5つ目の出力では、文字列の中になにやら「\r\n」なるものがありますが、そのまま出力されています。この、「\r」は「改行(キャリッジリターン)」、「\n」は「改行(ラインフィールド)」という意味を持った「エスケープシーケンス」なのですが、機能していません。

6つ目の出力では、文字列の中に変数が紛れ込んでいますが、そのまんま出力されています。

二重引用符「"(ダブルクォーテーション)」

以下のサンプルをご覧下さい。

<html>
<body>
<p>
<?php
    $hode = "TEST1";
    $nasu = "TEST2";
    
    echo "hello, HODENASU!!";
    echo "<hr />";
    echo "hello, \"HODENASU!!\"";
    echo "<hr />";
    echo "hello, I'm a HODENASU!!";
    echo "<hr />";
    echo "hello, \ HODENASU!! \\";
    echo "<hr />";
    echo "hello, HODENASU!! \r\n Good Bey";
    echo "<hr />";
    echo "hello, HODENASU!! $hode $nasu";
?>
</p>
</body>
</html>

結果は以下の通りです。

hello, HODENASU!!

hello, "HODENASU!!"
hello, I'm a HODENASU!!
hello, \ HODENASU!! \
hello, HODENASU!! Good Bey
hello, HODENASU!! TEST1 TEST2

1つ目から4つ目までは何となく理解できると思います。問題は5番目と6番目の出力です。

5つ目の出力では、文字列の中の「\r\n」、「エスケープシーケンス」が表示されていません。それは、エスケープシーケンスとして機能したために表示されていないのです。どのような機能が働いたのかは、結果のソースを見てみると解ります。「hello, HODENASU!!」と「Good Bey」の間で改行されています。

...hello, HODENASU!!
Good Bey...

\r\n」は、HTMLコード上での改行をするものなのです(「改行コード」)。

6つ目の出力では、なんと、文字列の中に紛れ込んでいた変数が展開されています。引用符の時には展開されなかった変数は、二重引用符では展開されるのです。

また、文字列中に変数を紛れ込ませる場合は、文字列と変数名を明確に区別させるために、以下のように記述する事が出来るので、この書き方を推奨いたします。

<html>
<body>
<p>
<?php
    $hode = "TEST1";
    $nasu = "TEST2";
    
    echo "hello, HODENASU!! {$hode} {$nasu}";
    echo "hello, HODENASU!! ${hode} ${nasu}";
?>
</p>
</body>
</html>

なお、ここで登場した「エスケープ」には、主に以下の種類があります。

記述意味
\nラインフィールド(LF)(改行)
\rキャリッジリターン(CR)(復帰:行の先頭に戻る事)
\t水平タブ(HT)
\\バックスラッシュ(OSの設定によっては円マーク)
\$ドル記号
\"二重引用符
\[0-7]{1,3}正規表現にマッチする8進数表記の1文字
\x[0-9a-fA-F]{1,2}正規表現にマッチする16進数表記の1文字

ヒアドキュメント構文

まずは、以下のサンプルをご覧下さい。

<html>
<body>
<p>
<?php
    $hode = <<< EOT
  <em>HODENASU 1</em><br />
  <em>HODENASU 2</em><br /><br />

EOT;

    echo $hode;
    
    
    echo <<< EOT
  <em>HODENASU 1</em><br />
  <em>HODENASU 2</em>

EOT;
?>
</p>
</body>
</html>

結果は以下の通りです。

HODENASU 1
HODENASU 2

HODENASU 1
HODENASU 2

そして、この結果のソースを見ると以下のようになっています。

  <em>HODENASU 1</em><br />
  <em>HODENASU 2</em><br /><br />
  <em>HODENASU 1</em><br />
  <em>HODENASU 2</em>

変数に格納してから出力するタイプと直接出力するタイプを書いてみましたが、結果は同じです。注目するのは、「<<< EOT」の部分と「EOT;」です。この2つに囲まれた部分が、そのまんまの形の文字列として扱われます。

まず、「<<<」の後の「EOT」と終端の「EOT;」の部分の「EOT」ですが、これは変数の時と同様の命名規則に沿って付けられた任意のIDです。

ここで注意しなければならない事があります。それは、終端の「EOT;」を記述した行には、「EOT;」以外のスペース等を書いてはいけないと言う事です。書くとエラーが発生してしまいます。

ヒアドキュメントは、二重引用符で囲まれた場合と全く同じ動作をします。つまり、ヒアドキュメントでも変数が展開されます。

また、うっかり定数(「定数」のページで解説)を書いても、展開される事はありません(当たり前ですが)。

文字列の文字単位(バイト単位)でのアクセス

「{ }(中括弧、波括弧)」を以下のサンプルの様に使用して、文字列中の単一文字にアクセスする事が出来ます。

<html>
<body>
<p>
<?php
    $hode = "abcdefghijklmnopqrstuvwxyz";
    
    echo $hode;
    echo "<br />";
    echo $hode{0};
    echo "<br />";
    echo $hode{10};
    echo "<br />";
    
    $hode{25} = "Z";
    
    echo $hode;
?>
</p>
</body>
</html>

結果は以下の通りです。

abcdefghijklmnopqrstuvwxyz
a
k
abcdefghijklmnopqrstuvwxyZ

見ての通り、「$hode{10}」と、文字列を格納した変数の後ろに「{ }(中括弧、波括弧)」を置き、その中に指定した整数値の場所(その文字列の先頭から何バイト目の文字か)の文字にアクセス出来ました。

整数型(integer)

整数は、「10進数」、「16進数」、「8進数」表記で書くことが出来ます。オプションで符号を付けることも可能です。それぞれ、以下のように書きます。

<?php
    $a = "2004";
    
    $a = 2004;
    $a = -30;
    $a = 0120;
    $a = 0xF1;
?>

1つ目は文字列の「"2004"」で、2〜5つ目が整数リテラルです。

それぞれ、2つ目が「10進数」、3つ目が「負の数」、4つ目が「8進数」、5つ目が「16進数」です。

「8進数」で整数を表記する場合は、数字の先頭に「0」を書き、「16進数」で整数を表記する場合は、数字の先頭に「0x」もしくは「0X」を書きます。

浮動小数点数型(float もしくは double(どっちでもいい))

まず、浮動小数点数が何なのかですが、これは「小数点以下に数字がある数字、つまり少数がある数字」の事です。以下のように書きます。ちなみに、浮動小数点数に対して整数の事を「固定小数点数」と言います。

<?php
    $a = 10.5;
    $a = 1.1E5;
    $a = 6e-2;
?>

ちなみに、上のサンプルの数字の意味ですが、「10.5」はいいとして、「1.1e5」の「e5」の部分ですが、これは、「1.1」に「10×5」を乗算するという意味で、「1.1e5」は「110000」と全くの同値です。「6E-2」は、「6」に「10÷2」を乗算するという意味で、「6E-2」は「0.06」と全くの同値です。なお、「e」は大文字と小文字どちらも同じ意味です。「e」の後の符号で、乗算するのか除算するのかが決まります。

論理値(真偽値)型(boolean)

論理型は、真偽の値をあらわします。この型には、「true」と「false」の2つだけしかありません。大文字と小文字どちらで書いてもOK。以下にサンプルを。

<?php
    $a = false;
    
    if($a){
        echo "true";
    }else{
        echo "false";
    }
?>
false

この論理型の値、論理値(真偽値)は、「制御構造」のページでも書いたように、制御文の条件判定に使われる値です。「真」なら実行、「偽」なら非実行です。また、文字列の「""」つまり空文字列と数値の「0」は「偽」であり、それ以外は「真」だと解釈されると書きましたが、これは、制御文の条件式としての文字列または数値が、論理型の値に自動的に変換されたためです。

このように、PHPでは、状況によって値の型が、自動的に他の型に変換されます。例えば、文字列型の「"2004"」に整数型の「10」を加算しようとすると、文字列型の「"2004"」は整数型の「2004」に自動的に変換された後、加算処理されます。

配列型(array)

配列型については、「配列」のページで解説します。以下にサンプルのみ。

<?php
    $arr1 = array("inu", "neko", "tanuki");
    $arr2 = array( "inu" => "wan",
                   "neko" => "nyan",
                   "tanuki" => "garuru?" );
    
    echo arr1[0];
    echo "<hr />";
    echo arr2["neko"];
?>
inu

nyan

オブジェクト型(object)

オブジェクト型については、「クラス」のページで解説します。以下にサンプルのみ。

<?php
    class TEST{
        function func1(){
            echo "HODENASU!!";
        }
    }
    
    $obj = new TEST();
    $obj->func1();
?>
HODENASU!!

上のサンプルでは、「$obj」がオブジェクト型の変数です。

リソース型(resource)

リソースとは、掲示板などでデータを保存しておくファイル等の事です。リソース型は、このリソースへのリファレンス(参照)を保持します。これについては追々解説したいと思います。以下にサンプルのみ。

<?php
    $filename = "./testfile.dat";
    $fp = @fopen($filename, 'rb');
    …
    fclose($fp);
?>

上のサンプルでは、「$fp」がリソース型の変数です。

ヌル型(NULL)

ヌル型は、リテラル(具体的な値)を持ちません。これは、ある変数が値を持たない事を表す型です。以下のような場合、変数は「NULL(大文字でも小文字でもOK)」であると解釈されます。

  • 定数(「定数」のページで解説)「NULL」が代入されている。
  • 変数に値が代入されていない。

以下にサンプル。

<?php
    $var1 = NULL;
    $var2 = HODE;
    
    if($var1){
        echo "aaa";
    }elseif($var2){
        echo "bbb<hr />";
        echo NULL;
        echo "<hr />";
        echo HODE;
    }else{
        echo "ccc";
    }
?>
bbb


HODE

$var1」には定数の「NULL」を代入し、「$var2」には定数の「HODE」を代入しました。「if文」の条件判定で、「NULL」は「偽」と解釈され、「HODE」は「真」と解釈されています。そして、「NULL」は出力されず、「HODE」は出力されています。これは単に、定義されていない定数(「HODE」)は文字列と見なされるというPHPの仕様によるものです。

型の相互変換

変数を定義するとき、PHP以外の他の言語(C等)では、その変数が何の型かを明示する必要がありますが、PHPでは、変数の型は変数に値を代入した時点で、代入された値の型が、変数の型になります。ある変数に文字列を代入すれば文字列型になり、更に整数を代入すると整数型になります。C言語(5分で挫折)ではこんな事は出来ません(C言語では、整数型の変数には整数しか代入出来ない)。

また、PHPには「自動型変換」という機能があり、変数の使われる状況によってその型を自動的に変換します。以下のサンプルと結果をご覧下さい。

<?php
    $var1 = "200";
    $var2 = "50";
    $var3 = "HODENASU";
    
    echo $var1 + $var2;
    echo "<hr />";
    echo $var1 + $var3;
?>
250

200

変数「$var1」と「$var2」にはそれぞれ文字列の「"200"」、「"50"」が代入されました。そして、この2つの変数を「+(加算演算子)」で加算処理したものを出力しようとしています。しかし、文字列同士を加算する事は出来ません。しかし、実際は出来ています。これは、自動型変換機能によるもので、文字列の「"200"」と「"50"」が整数の「200」と「50」に自動的に変換されたためです。また、「変数$var3」は完全に文字列ですが、これも型変換されています。整数に変換しようがない値は、「0」に変換されるようです。

他の例では、既に解説しましたが、制御文の条件式に指定したものは、全て論理型に変換され、条件判定に使用されます。文字列の「""」や数値の「0」が「偽」と判定されると書いたのは、実際には、論理型の「false」に変換されていたのです。

なお、「変換」と言っても、実際に値が変換されるという事ではなく、その値がどう解釈されるべきかによって、「見なされるべき形で見なされる」という事です。「意味解かんなーい」要するに、例えるとですね。まず、花子さんは太郎さんの妻であるとします。で、「花子さんの性別は何ですか?」と聞かれた場合、「太郎さんの妻です」と答えたらこの人は馬鹿だと判定されますね。じゃなくて、「女性です」と答えますね。でも、花子さんが太郎さんの妻であることに変わりはないと。「ますます意味解かんなーい」

型キャスト

PHPには自動型変換機能があって、自動的に変換してくれるわけですが。人間が型を変換させる事も出来ます。で、この行為を「型をキャストする」と言います。以下に型のキャストの方法を示します。

<?php
    $var1 = 21.5;
    $var2 = 21;
    
    echo (int)$var1 + $var2;
    echo "<hr />";
    echo $var1 + $var2;
?>

変数「$var1」と「$var2」にはそれぞれ浮動小数点数の「21.5」、整数の「21」を代入。この2つの変数を「+(加算演算子)」で加算処理して出力を2回するというものですが、結果は以下のようになります。

42

42.5

サンプルの中の「(int)$var1」の部分が、型キャストを行っている所です。

型を変換したい場合、変換したい変数の前に「(キャストする型名)」を置く事で、キャストされます。が、自動型変換機能の時と同様、それはキャストしている時だけの扱われ方であって、実際に変換されるわけではありません。その証拠に、2度目の出力の結果から、「変数$var1」の値が浮動小数点数の「21.5」のままであるのが判ります。

なお、使用可能なキャストは以下の通り。

記述キャスト後
(int), (integer)整数
(bool), (boolean)論理値
(float), (double), (real)浮動小数点数
(string)文字列
(array)配列
(object)オブジェクト

おさらいと予告

型とは

  • 値の種類の違いは「型」の違い。
  • 型の種類は、「文字列型」、「整数型」、「浮動小数点数型」、「論理値(真偽値)型」、「配列型」、「オブジェクト型」、「リソース型」、「ヌル型」の8つ。
  • 型は状況によって自動的に変換されるが、それはあくまでその時の扱われ方の変換である。
  • 型は、手動で、強制的に変換させる事が出来る(型キャスト)。

関数

次回は、一連の処理を定義して置き、必要な時に呼び出して使う「関数」について解説します。

作成日:2004年05月12日 最終更新日:2004年05月15日
【印刷モード風モード で表示】