静岡理工科大学 菅沼ホーム PHP 目次 索引

PHP 概説

      1. 文法
        1. データ型
          1. 変数
          2. 使用可能な型
          3. 型変換
        2. 配列
          1. 定義と参照
          2. 定義済み変数(配列)
        3. 演算子
          1. 算術演算子と代入演算子
          2. 関係演算子,等値演算子,及び,論理演算子
          3. ビット演算子とシフト演算子
          4. その他
        4. 制御
          1. 分岐
          2. 繰り返し
          3. 外部ファイルの使用
        5. 関数
        6. クラス
        7. 変数の有効範囲(スコープ)
      2. 使用方法
        1. Web ページへの埋め込み
        2. コマンドラインからの使用
  1. 文法

      ここでは,PHP の言語仕様について,簡単に説明します.特に,C/C++ と似た部分に関しては,項目を羅列する程度で記述していきます.適宜,「 C/C++ と Java」の関連する箇所も示しておきますので,その箇所を参考にしながら読んでみてください.

    1. データ型データ型

      1. 変数

          基本的に型宣言という考え方がありません.つまり,C/C++ や Java のように,変数や関数の戻り値の型を宣言する必要がありません.変数(変数名の最初は必ず「 $ 」でなければない)であれば,その変数に代入されたリテラルの型によって変数の型も決まってしまいます.

      2. 使用可能な型

          PHP で使用できる主要な型や特別な定数は以下に示す通りです.なお,配列やオブジェクトに関しては後ほど述べます.

        1. 数値: 10 進整数,8 進数( 0 で始まる),16 進数( 0x で始まる),浮動小数点数を使用できます.環境によって異なりますが,基本的に,整数は 4 バイト,浮動小数点数は 8 バイトで表現されます.

        2. 論理型boolean ): 値は true,または,false(大文字,小文字を区別しない)になりますが,以下のものはすべて false とみなされます(そのほかはすべて true).

          false,0,0.0,空の文字列,"0",NULL

        3. NULL: 変数が値を持たないことを表します.

        4. 文字列: 文字列は,シングルクォーテーション「 ' 」,または,ダブルクォーテーション「 " 」によって囲んで表現されます.以下の例に示すように,シングルクォーテーションで囲まれた場合は,その内容がそのまま文字列の内容となりますが,ダブルクォーテーションで囲まれた場合はその内部のエスケープシーケンスや変数が評価されます.なお,ピリオド「 . 」によって文字列の結合が可能です.
          $x = 123;
          echo '変数$xの値は ';  // そのまま出力
          echo $x."<BR>\n";
          echo "変数$xの値は ".$x."<BR>\n";  // 「$xの値は」を変数名とみなしている
          echo "変数 $x の値は ".$x."<BR>\n";  // スペースで区切って変数を明確にする
          echo "変数 ${x} の値は ".$x."<BR>\n";  // 「{」と「}」で区切って変数を明確にする
          echo "変数 {$x} の値は ".$x."<BR>\n";  // 「{」と「}」で区切って変数を明確にする
          echo "変数 \$x の値は ".$x."<BR>\n";  // 「\」で「$」の機能を無効にする
          						
          上記のプログラムを記述したページを表示すると以下に示すような結果になります.
          変数$xの値は 123
          変数 123
          変数 123 の値は 123
          変数 123 の値は 123
          変数 123 の値は 123
          変数 $x の値は 123
          						
            文字列を表現する別の方法として,「<<<」を使用したヒアドキュメント構文があります.ヒアドキュメントは,以下の例に示すように,「<<<ヒヤドキュメント名」で始まり,文字列が入り,「ヒヤドキュメント名;」(終端 ID )で終わります.終端 ID は,その行の最初のカラムから始める必要があります.なお,ヒヤドキュメント内の文字列は,ダブルクォーテーションで囲まれた場合と同様,その内部のエスケープシーケンスや変数が評価されます.
          $y = 123;
          $x = <<<hd_e
          これは,ヒヤドキュメントの例です.<BR>
          変数\$yも評価({$y})<BR>
          されます.<BR>\n
          hd_e;
          echo $x;
          						
          上記のプログラムを記述したページを表示すると以下に示すような結果になります.
          これは,ヒヤドキュメントの例です.
          変数$yも評価(123)
          されます.
          						
      3. 型変換

          PHP で行える型変換キャスト演算子)は,以下に示す通りです.

        • (int), (integer) : 整数へのキャスト
        • (bool), (boolean) : 論理値へのキャスト
        • (float), (double), (real) : floatへのキャスト
        • (string) : 文字列へのキャスト
        • (array) : 配列へのキャスト
        • (object) : オブジェクトへのキャスト

    2. 配列配列),(new と delete

      1. 定義と参照

          配列を作成するには,以下の例に示すように,array() 関数を利用します.C++ や Java とは異なり,数字(添え字)ではなく文字列(キー,引用符で囲むこと)を使用して配列の要素を参照したり(連想配列),また,要素数を増加させていくことも可能です.なお,配列の中に配列を定義することによって,多次元配列も利用可能です.
        					// 宣言だけ
        $x = array();
        $x[0] = 1;
        $x[1] = 2;
        $x[2] = 3;
        $x[]  = 4;
        $x[]  = 5;
        print_r($x);
        echo "<BR>\n";
        					// 宣言と初期設定
        $y = array(10, 20, 30);
        $y[3] = 40;
        $y[4] = 50;
        print_r($y);
        echo "<BR>\n";
        					// キーによる設定と参照(その1)
        $z = array('first'=>100, 'second'=>200, 400);
        $z[]       = 500;
        $z['last'] = 300;
        print_r($z);
        echo "<BR>\n";
        					// キーによる設定と参照(その2)
        $w = array(4000, 'first'=>1000, 'second'=>2000);
        $w[]       = 5000;
        $w['last'] = 3000;
        print_r($w);
        echo "<BR>\n";
        					// 2 次元配列
        $xx       = array();
        $xx[0]    = array();
        $xx[1]    = array();
        $xx[0][0] = -1;
        $xx[0][1] = -2;
        $xx[0][2] = -3;
        $xx[1][0] = 1;
        $xx[1][1] = 2;
        $xx[1][2] = 3;
        print_r($xx);
        echo "<BR>\n";
        					
          上記のプログラムを記述したページを表示すると以下に示すような結果になります(表示されたページのソースファイルの一部).なお,print_r は配列を見やすく表示するための関数です.
        Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) 
        Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 [4] => 50 ) 
        Array ( [first] => 100 [second] => 200 [0] => 400 [1] => 500 [last] => 300 ) 
        Array ( [0] => 4000 [first] => 1000 [second] => 2000 [1] => 5000 [last] => 3000 ) 
        Array ([0] => Array([0] => -1[1] => -2[2] => -3)[1] => Array([0] => 1[1] => 2[2] => 3) )
        					
          C++ における new 演算子を使用する場合,Java,JavaScript,Ruby,Python などにおいては,配列変数は,データを記憶している領域の先頭を指すポインタとみなすことができます.従って,配列変数 u1 を 配列変数 u2 に代入した場合,u1 と u2 は同じ場所を指すことになり,u1 を介して各要素の値を変更すれば,u2 の対応する要素の値も変化します(逆も同様).しかし,PHP においては,かなり異なっています.例えば,
        $u1 = array(1, "abc", 2);
        $u2 = $u1;
        					
        の最初の行で,初期設定された配列 $u1 を定義し,次の行において $u1 を $u2 に代入しています.この代入によって,整数型の場合と同じように,$u1 のすべてのデータが $u2 にコピーされ新しい配列が作成されます.また,2 次元配列の場合も同様であり,例えば,
        $v1 = array(2);
        $v1[0] = array(10, 20, 30);
        $v1[1] = array(40, 50, 60);
        $v2 = $v1;
        					
        における 4 行目の代入文によって,$v2 は,$v1 のすべての要素をコピーして,全く新しい配列として生成されます.さらに,
        $v4 = $v1[0];
        					
        のように,2 次元配列 $v1 の各行を 1 次元配列として扱うことも可能です.この場合も,1 次元配列の場合と同様,$v4 は,$v1 の 1 行目のすべての値をコピーした全く新しい配列となります.

      2. 定義済み変数(配列)

        1. $_SERVER: ヘッダ,パス,スクリプトの位置など( $_SERVER['PHP_SELF']のような形で参照)

          • 'PHP_SELF' 現在実行しているスクリプトのファイル名
          • 'SERVER_NAME' 現在のスクリプトが実行されているサーバーのホスト名
          • 'REQUEST_TIME' リクエストの開始時のタイムスタンプ
          • 'DOCUMENT_ROOT' 現在実行されているスクリプトが存在するドキュメントルートディレクトリ
          • 'REMOTE_ADDR' 現在ページをみているユーザーの IP アドレス
          • 'SCRIPT_FILENAME' 現在実行されているスクリプトの絶対パス

        2. $_ENV: 環境変数

        3. $_COOKIE: クッキー.setcookie ( name [, value [, expire [, path [, domain [, secure]]]]] ) 関数を利用して書き込み,その内容は変数 $_COOKIE を通して,例えば $_COOKIE['name'] のような形で参照できます.なお,setcookie 関数の引数の意味は以下に示すとおりです.

          • name: クッキーの名前
          • value: クッキーに設定する値.「,」「;」「半角スペース」は使用しないこと.
          • expire: クッキーの有効期限.UNIX 標準時( 1970 年 1 月 1 日)からの秒数.設定しないと,ブラウザを閉じるときが有効期限となる.
          • path: クッキーを有効としたいパス.指定したパス以下のディレクトリで有効となる.例えば,URLが「https://www.sist.ac.jp/~suganuma/home/」のような場合は,「/~suganuma/home/」などを設定する.設定しない場合は,値をセットしたときのカレントディレクトリになる.
          • domain: クッキーが有効なドメイン.例えば,URLが「https://www.sist.ac.jp/~suganuma/home/」のような場合は,「www.sist.ac.jp」を設定する.
          • secure: 1 をセットすると セキュアな HTTPS 接続の場合にのみクッキーが送信されるようになる.デフォルトは 0 である.

        4. $_GET: FORM において GET メソッドを通して渡された情報(「データの送信とファイルのアップロード」参照)や他ページから渡されたパラメータ情報.例えば,「パラメータ情報の例」においては,「<A HREF="parameter.php?par1=100&par2=aaa" TARGET="parameter">パラメータ情報の例</A>」のような形で,2 つのパラメータが parameter.php に渡されている.parameter.php のソースコードは以下に示す通りであり,PHP 及び JavaScript を使用して,$_GET を通して渡された 2 つのパラメータ値を取りだし,表示している.
          <!DOCTYPE HTML>
          <HTML>
          <HEAD>
          	<TITLE>パラメータ情報</TITLE>
          	<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
          	<LINK REL="stylesheet" TYPE="text/css" HREF="../../master.css">
          	<SCRIPT TYPE="text/javascript">
          		function GetParameter()
          		{
          			let result = new Array();
          			if(1 < window.location.search.length) {
          							// 最初の1文字 (?記号) を除いた文字列を取得する
          				let str = window.location.search.substring(1);
          							// 区切り記号 (&) で文字列を配列に分割する
          				let param = str.split('&');
          				for (let i1 = 0; i1 < param.length; i1++ ) {
          							// パラメータ名とパラメータ値に分割する
          					let element = param[i1].split('=');
          					let Name    = decodeURIComponent(element[0]);
          					let Value   = decodeURIComponent(element[1]);
          							// パラメータ名をキーとして連想配列に追加する
          					result[Name] = Value;
          				}
          			}
          			return result;
          		}
          	</SCRIPT>
          </HEAD>
          <BODY CLASS="white">
          	<H1>パラメータ情報</H1>
          	<H3>PHP による方法</H3>
          <?php
          	if(isset($_GET['par1'])) {
          		$p1 = $_GET['par1'];
          		print("$p1<BR>\n");
          	}
          	if(isset($_GET['par2'])) {
          		$p2 = $_GET['par2'];
          		print("$p2<BR>\n");
          	}
          ?>
          	<H3>JavaScript による方法</H3>
          	<SCRIPT TYPE="text/javascript">
          		result = GetParameter();
          		document.write(result['par1'] + "<BR>");
          		document.write(result['par2'] + "<BR>");
          	</SCRIPT>
          </BODY>
          </HTML>
          						
        5. $_POST: FORM において,POST メソッドを通して渡された情報(「データの送信とファイルのアップロード」参照).

        6. $_FILES: ファイルアップロードに関する情報(「データの送信とファイルのアップロード」参照).

        7. $_SESSION: セッション情報.セッションとは,クッキーと同様,サーバとクライアント間において複数回やりとりした情報を一時的に保存するための機能です.セッションとクッキーの違いは,クッキーはクライアント側で情報を保存しますが,セッションではサーバー側で情報を保存します.具体的な使用方法に関しては,「クッキーとセッション」を参照してください.

    3. 演算子

      1. 算術演算子代入演算子算術演算子と代入演算子
        . : 文字列の結合
        + : 加算(配列の場合は要素の和集合,後述)
        - : 減算
        * : 乗算
        / : 除算  小数点以下が常に計算される
                    ( floor($x / $y),intval($x / $y),(int)($x / $y),(integer)($x / $y) )
        % : 余り  被除数,除数を共に整数型に変換(小数点以下を切り捨て)してから計算
                    ( 7.3 % 2.3 は,1 )
        = : 代入
        ++ : インクリメント演算子( 1 だけ増加)
        -- : デクリメント演算子( 1 だけ減少)
        					
      2. 関係演算子等値演算子,及び,論理演算子関係演算子,等値演算子,及び,論理演算子
        >  より大きい  a > b   式 a の値が式 b の値より大きいとき真
        <  より小さい  a < b   式 a の値が式 b の値より小さいとき真
        >= 以上     a >= b  式 a の値が式 b の値以上のとき真
        <= 以下     a <= b  式 a の値が式 b の値以下のとき真
        == 等しい     a == b  式 a の値と式 b の値が等しいとき真(配列にも使用可)
        === 等しい     a === b  式 a と式 b の型と値が等しいとき真(配列にも使用可)
        !=, <> 等しくない a != b, a <> b  式 a の値と式 b の値が等しくないとき真(配列にも使用可)
        !== 等しくない   a !== b  式 a と式 b の型か値が等しくないとき真(配列にも使用可)
        ||, or 論理和    x || y, x or y  式 x が真か,または,式 y が真のとき真
        &&, and 論理積   x && y, x and y  式 x が真で,かつ,式 y が真のとき真
        xor 排他的論理和  x xor y  式 x,または,式 y のいずれか一方だけが真のとき真
        !  否定        ! x      式 x が偽のとき真
        					
      3. ビット演算子シフト演算子ビット演算子とシフト演算子
        | 論理和      x | y   対応するビットのいずれかが 1 のとき真.
        & 論理積      x & y   対応するビットの双方が 1 のとき真
        ^ 排他的論理和 x ^ y   対応するビットが異なるのとき真
        ~ 1の補数     ~ x      ビット毎に 1 と 0 を反転する
        << 左にシフト   x << 3  3 ビット左にシフト.x を 23 倍することに相当.
        >> 右にシフト   x >> 3  3 ビット右にシフト.x を 23 で割ることに相当.
        					
      4. その他

        1. new: オブジェクトの生成( obj = new Date() )

        2. + : PHP では,配列に対して,通常の変数や定数と同じようないくつかの演算子を使用できます.先に述べた比較演算子の場合は,各要素毎の比較が行われます.ここで述べる + 演算子は,キー(添え字)による要素の和集合を生成します.詳細については以下の例を見て下さい.
          					// 添え字
          $a1 = array(10, 20, 30);
          $b1 = array(10, 50, 60, 70);
          $c1 = $a1 + $b1;
          $d1 = $b1 + $a1;
          print_r($c1);
          echo "<BR>\n";
          print_r($d1);
          echo "<BR>\n";
          					// キー
          $a2 = array('x'=>100, 'y'=>200, 'z'=>300);
          $b2 = array('x'=>100, 'y'=>2000, 'z'=>3000, 'w'=>4000);
          $c2 = $a2 + $b2;
          $d2 = $b2 + $a2;
          print_r($c2);
          echo "<BR>\n";
          print_r($d2);
          echo "<BR>\n";
          						
            上記のプログラムを記述したページを表示すると以下に示すような結果になります(表示されたページのソースファイルの一部).なお,print_r は配列を見やすく表示するための関数です.
          Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 70 )
          Array ( [0] => 10 [1] => 50 [2] => 60 [3] => 70 )
          Array ( [x] => 100 [y] => 200 [z] => 300 [w] => 4000 )
          Array ( [x] => 100 [y] => 2000 [z] => 3000 [w] => 4000 ) 
          						
        3. & : リファレンスとは同じ変数の内容を異なった名前で参照することを意味します.PHP では,変数名と変数の内容は異なっている(右図の一番左側)ため,同じ内容を異なった複数の名前で参照することが可能になります.下の例では,変数 $a と $b は同じ内容を指しています(右図の中央).また,関数(後述)に対する参照渡し(下の例)や戻り値をリファレンスにすることも可能です.右図の一番右側に示すように,C/C++ のポインタに似ていますが,多少異なっていることが分かると思います((アドレス演算子と間接演算子),(参照渡し)).
          $a = 10;
          $b = &$a;
          echo "a = $a, b = $b <BR>\n";
          $b++;
          echo "a = $a, b = $b <BR>\n";
          unset($a);   // unset($b) も可能
          echo "a = $a, b = $b <BR>\n";
          function add(&$x)
          {
          	$x++;
          }
          add($b);
          echo "a = $a, b = $b <BR>\n";
          						
            上記のプログラムを記述したページを表示すると以下に示すような結果になります.なお,このプログラムをコマンドプロンプト上で実行すると,変数 $a に対して,「 Undefined variable: ・・・ 」のようなメッセージが出力されます.
          a = 10, b = 10 
          a = 11, b = 11 
          a = , b = 11 
          a = , b = 12
          						
        4. ` (実行演算子): PHP では,実行演算子,つまり,バッククォート( `` )によってコマンドを囲むことによって,そのコマンドを実行し,その結果を返すことができます.たとえば,
          $a = `ls *`;
          echo $a."<BR>\n";
          						
          という命令を実行すると,例えば,以下のような結果が得られます.
          exec.php test.php test1.php test2.php
          					
    4. 制御

      1. 分岐分岐

        1. if 文
          if (論理式) {
          	文1(複数の文も可)
          }
          else {
          	文2(複数の文も可)
          }
          						
        2. else if 文
          if (論理式) {
          	文1(複数の文も可)
          }
          else if (論理式) {
          	文2(複数の文も可)
          }
            ・・・
          else {
          	文n(複数の文も可)
          }
          						
        3. switch 文
          switch (式) {
          	[case 定数式1 :]
          		[文1]
          	[case 定数式2 :]
          		[文2]
          	 ・・・・・
          	[default :]
          		[文n]
          }
          						
      2. 繰り返し繰り返し

        1. for 文
          for (初期設定; 繰り返し条件; 後処理) {
          	文(複数の文も可)
          }
          						
        2. while 文
          while (繰り返し条件) {
          	文(複数の文も可)
          }
          						
        3. do while 文
          do {
          	文(複数の文も可)
          } while (繰り返し条件) ;
          						
        4. foreach 文
          foreach (配列変数名 as 値を入れる変数名) { 文 }
          foreach (配列変数名 as キーを入れる変数名 => 値を入れる変数名) { 文 }
          						
            以下の例に示すように,配列に対する反復処理を行います.上に示した書式の通り,値だけを取り出す方法とキーと値を取り出す方法があります.なお,foreach は配列のコピーを取り出すため,取り出した要素の値を変更しても元の配列の値は変化しません.
          $x = array('first'=>1, 'second'=>2, 'last'=>3);
          foreach ($x as $key => $value)
          	echo "キー: ".$key.", 値: ".$value."<BR>\n";
          						
          このプログラムを実行すると,以下のような結果が得られます.
          キー: first, 値: 1
          キー: second, 値: 2
          キー: last, 値: 3
          						
      3. 外部ファイルの使用require()require_once()include()include_once() )(#include

          以下の例に示すように,C++ の「 #include 」に似た処理を行うことが可能です.require,require_once は,スクリプトの実行前に指定されたファイルを読み込み,その行をファイルの内容で置き換え,エラーがあると処理を中止します.また,include,include_once は,スクリプトの実行時に同様の処理を行い,エラーがあると警告メッセージを出力し,処理は継続します.なお,いずれにおいても,once を付加すると,既に読み込まれたファイルを再度読み込むことはしません.
        読み込むファイルの内容:
        
        	require_once('./array.def');
        	foreach ($x as $key => $value)
        		echo "キー: ".$key.", 値: ".$value."<BR>\n";
        
        読み込まれるファイル(array.def)の内容:
        
        	$x = array('first'=>1, 'second'=>2, 'last'=>3);
        					
          上記のプログラムを記述したページを表示すると以下に示すような結果になります.
        キー: first, 値: 1
        キー: second, 値: 2
        キー: last, 値: 3
        					

    5. 関数簡単な関数),(配列),(参照渡し

        関数に対する一般的記述方法は,
      function 関数名 (引数, ・・・) {
      	処理
      }
      				
      のようになります.また,値を返したい場合は,return 文 を使用します.

        関数の引数としては,値渡しのほかに,先に述べたように,参照渡しが可能です.また,以下の例に示すように,デフォルト引数を使用することも可能です.さらに,可変長引数もサポートしています.
      function message($str = "default message")
      {
      	return $str;
      }
      echo message()."<BR>\n";
      echo message("新しいメッセージ")."<BR>\n";
      				
        上記のプログラムを記述したページを表示すると以下に示すような結果になります.
      default message
      新しいメッセージ
      				
        配列を引数とする場合には注意が必要です,C/C++,Java,JavaScript,Ruby,Python などにおいては,配列変数はポインタとみなされますので,配列を関数の引数とした場合,ポインタがコピーされて渡されるため,関数内で配列の要素を変更すれば,関数を呼んだ側の対応する要素の値も変化します.しかし,PHP の場合は,配列に含まれる要素全体がコピーされて渡されるため,関数内において配列の要素の値を変更しても,関数を呼んだ側の配列はその影響を受けません.関数の呼んだ側における配列の値も変更したい場合は,参照渡しをする必要があります.ただし,次の節で述べるクラスのオブジェクトの場合は,そのアドレスが渡されるとみなされますので,関数内における変更が関数を呼んだ側に反映される点に注意してください.

    6. クラスクラス),(派生クラス

        PHP におけるクラスの使用方法に関しては,以下に示す例によって説明していきます.
      01	class Number
      02	{
      03		public $name;   // var $name;
      04		function Number($str = "数")   // コンストラクタ
      05		{
      06			$this->name = $str;
      07		}
      08	}
      09
      10	class Complex extends Number
      11	{
      12		private $r_part;   // var $r_part;
      13		private $i_part;   // var $i_part;
      14		function Complex($x, $y, $str = "複素数")   // コンストラクタ
      15		{
      16			parent::Number($str);
      17			$this->r_part = $x;
      18			$this->i_part = $y;
      19		}
      20		function out()
      21		{
      22			echo "実部 = $this->r_part, 虚部 = $this->i_part <BR>\n";
      23		}
      24	}
      25
      26	$y = new Number();
      27	echo $y->name."<BR>\n";
      28
      29	$x = new Complex(1.0, 2.0);
      30	echo $x->name."<BR>\n";
      31	$x->out();
      				
        このプログラムの場合,3 行目,12 行目,13 行目は,コメントに示したように,変数を表すため var を使用しても正常に動作します.しかし,変数に対する参照可能な範囲を明確にするため,public(どこからでも参照可能),protected(継承したクラスから参照可能),private(クラスのメンバー関数から参照可能)のいずれかを使用することが推奨されています.

        1 ~ 8 行目はクラス Number,10 ~ 24 行目はクラス Complex の定義です.クラス Complex は,キーワード extends を利用して,クラス Number を継承しています.このとき,クラス Number をクラス Complex の基底クラス,クラス Complex を派生クラスといいます.継承を行うことによって,親が持っている変数や関数をすべて利用できるようになります.なお,PHP においては,1 つのクラスだけを継承できます.

        16 行目の演算子「 :: 」は,基底クラスの関数や変数を参照したり,まだ特定のインスタンスを持たないクラスの関数を参照したりするために利用します.ここでは,基底クラスのコンストラクタを呼び出すために利用しています.なお,コンストラクタとは,クラス名と同じ名前の関数であり,クラスのインスタンス(オブジェクト)を生成するとき(例えば,26,29 行目)に最初に呼ばれます.初期設定等を行うために利用されます.

        クラスの変数や関数を参照するには,「->」演算子を利用します.特に,変数を参照する場合,「 $x->$name 」ではなく,「 $x->name 」である点に注意して下さい(「$」は一つだけ使用).なお,this は,自分自身を指すキーワードです.

        上記のプログラムを記述したページを表示すると以下に示すような結果になります.
      数
      複素数
      実部 = 1, 虚部 = 2
      					

    7. 変数の有効範囲(スコープ)

      01	<?php
      02	
      03		/****************************/
      04		/* 変数の有効範囲(スコープ) */
      05		/*      coded by Y.Suganuma */
      06		/****************************/
      07		
      08		/*******************/
      09		/* クラス Example1 */
      10		/*******************/
      11		class Example1 {
      12			private $pri;
      13			protected $pro;
      14			public $pub;
      15	
      16			function Example1() {
      17				$this->pub = 1000;
      18				$this->pri = 2000;
      19				$this->pro = 3000;
      20			}
      21	
      22			function sub1() {
      23				printf("sub1 pub %d pri %d pro %d\n", $this->pub, $this->pri, $this->pro);
      24			}
      25		}
      26	
      27		/*******************/
      28		/* クラス Example2 */
      29		/*******************/
      30		class Example2 extends Example1 {
      31			function sub2() {
      32				printf("sub2 pub %d pro %d\n", $this->pub, $this->pro);
      33	//			printf("sub2 pri %d\n", $this->pri);   // 許されない
      34			}
      35		}
      36	
      37		/****************/
      38		/* main program */
      39		/****************/
      40				// ブロック
      41		$x = 10;
      42		$z = 30;
      43		if ($x > 5) {
      44			printf("block x %d\n", $x);
      45			$x = 15;
      46			$y = 20;
      47			printf("block x %d\n", $x);
      48			printf("block y %d\n", $y);
      49		}
      50		else {
      51			printf("block x %d\n", $x);
      52			$x = -15;
      53			printf("block x %d\n", $x);
      54		}
      55		sub();
      56		printf("x %d\n", $x);
      57		printf("y %d\n", $y);   // 最初の x が 1 の時は,y が未定義のためエラー
      58				// クラス
      59		$ex = new Example2();
      60		$ex->sub1();
      61		$ex->sub2();
      62		printf("public member( pub ) %d\n", $ex->pub);
      63	
      64		/************/
      65		/* 関数 sub */
      66		/************/
      67		function sub()
      68		{
      69			$x = 40;
      70			printf("   sub x %d\n", $x);
      71			global $z;
      72			printf("   sub z %d\n", $z);
      73		}
      74	
      75	?>
      				
        まず,41 行目において,変数 $x が定義され(変数 $x に値が代入され),10 で初期設定されています.この変数 $x は,この位置から main プログラムが終わる 62 行目まで有効になります.43 ~ 49 行目の if ブロック内の 44 行目において,変数 $x の値が出力されていますが,当然,その結果は,41 行目で宣言されたときの値になります.しかし,45 行目において,再び,変数 $x が宣言されていますが,PHP の場合は,C++ の場合とは異なり,41 行目で宣言された変数 $x に置き換わることになります.従って,ここで宣言された変数 $x の有効範囲は,main プログラムの終わりである 62 行目までになります.実際,56 行目における出力文では,45 行目において宣言された変数 $x の値が出力されます.同様に,46 行目で宣言された変数 $y の有効範囲も 62 行目までとなります.この例では,問題がありませんが,41 行目における変数 $x の初期値を 5 以下に設定すると,50 ~ 54 行目が実行されることになります.そのブロック内では,変数 $y が使用されていませんので,57 行目の出力文はエラーになってしまいます.変数が定義されているか否か(変数に値が代入されているか否か)の見極めが困難である場合も多いと思いますので,十分注意してください.

        55 行目において関数 sub を呼んでいます.69 行目では,変数 $x を宣言し,70 行目において,その値を出力しています.当然,69 行目の宣言を行わなければ,エラーになってしまいますし,また,69 行目の宣言によって,45 行目で宣言された $x の値が影響を受けることはありません( 56 行目に対応する出力結果参照).しかし,変数 $z は,関数 sub 内に宣言されておらず,42 行目において宣言されています.上で述べた変数 $x と同様,関数内において,main プログラムや他の関数内の変数を参照することはできません.しかし,71 行目の記述( global )によって,main プログラム内の変数を参照可能になります.このように,関数の外側で宣言された変数を関数内から参照可能にした変数をグローバル変数と呼びます.逆に,変数 $x や $y のように,あるブロック(関数を含む)内だけで有効な変数を,ローカル変数と呼びます.以上,41 ~ 57 行目内の出力文(関数 sub 内の出力文を含む)によって,以下に示すような出力が得られます.
      block x 10
      block x 15
      block y 20
         sub x 40
         sub z 30
      x 15
      y 20
      					
        次に,クラスに付いて考えてみます.11 ~ 25 行目においてクラス Example1 が定義され,30 ~ 35 行目では,クラス Example1 を継承する形で,クラス Example2 が定義されています.PHP においては,クラス Example の各変数や関数のアクセス権は,そのままクラス Example2 に引き継がれます.

        59 行目において,Example2 のインスタンス $ex を生成し,60 行目では,クラス Example1 から継承した関数 sub1 を通して,3 つの変数を出力しています.このときは,3 つの変数の値がそのまま出力されます.しかし,61 行目では,クラス Example2 に追加された関数 sub2 を通して各変数を出力しています.ただし,この場合は,親クラス Example1 の private メンバー変数 $pri を参照することができない点に注意してください.また,62 行目のようなクラスの外側からの参照においては,pubulic メンバー変数 $pub だけを参照可能です.なお,private 指定は,同じクラス内の関数だけから,protected 指定は,同じクラス,及び,そのクラスを継承したクラスだけから,また,public 指定は,どこからでも参照可能なことを意味します.以上,59 ~ 62 行目内の出力文によって,以下に示すような出力が得られます.
      sub1 pub 1000 pri 2000 pro 3000
      sub2 pub 1000 pro 3000
      public member( pub ) 1000
      					

  2. 使用方法

    1. Web ページへの埋め込み

        ファイル(拡張子は,通常,php とする)内に PHP のプログラムを記述する場合は,
      <?php   // <? でも良い場合がある
      
      	ここに,PHP のプログラム
      ?>
      				
      のように記述します.PHP では,下の使用例(赤字の部分が PHP)に示すように,HTML 文書自体を PHP プログラムで操作(下の例では,<DD> 要素によって記述された文を繰り返している)したり,また,HTML 文書内に「 <?php echo 文字列 ?> 」の方法で,PHP 内の変数値を埋め込むことも可能です(16 行目参照).なお,PHP の設定によっては,「 <?php 」を「 <? 」,「 <?php echo 」を「 <?= 」と記述する省略形が可能ですが,基本的に避けた方が良いと思います.
      01	<!DOCTYPE HTML>
      02	<HTML>
      03	<HEAD>
      04		<TITLE>PHPの例</TITLE>
      05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
      06		<LINK REL="stylesheet" TYPE="text/css" HREF="../../master.css">
      07	</HEAD>
      08	<BODY CLASS="white">
      09		<H1>PHPの例</H1>
      10		<DL>
      11			<DT>嗜好品
      12	<?php
      13		$fr = array ('リンゴ', 'ミカン', 'イチゴ');
      14		for ($i = 0; $i < 3; $i++) {
      15	?>
      16			<DD>果物: <?php echo $fr[$i]."\n" ?>
      17	<?php
      18		}
      19	?>
      20		</DL>
      21	</BODY>
      22	</HTML>
      				
        また,JavaScript とは異なり,PHP プログラムはサーバ側で実行され,その結果だけがクライアント側に表示されます(PHP のプログラム自身を見ることは出来ない).したがって,上の例の場合,クライアント側に表示されたページのソースコードは以下のようになります.
      <!DOCTYPE HTML>
      <HTML>
      <HEAD>
      	<TITLE>PHPの例</TITLE>
      	<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
      	<LINK REL="stylesheet" TYPE="text/css" HREF="../../master.css">
      </HEAD>
      <BODY CLASS="white">
      	<H1>PHPの例</H1>
      	<DL>
      		<DT>嗜好品
      		<DD>果物: リンゴ
      		<DD>果物: ミカン
      		<DD>果物: イチゴ
      	</DL>
      </BODY>
      </HTML>
      				

    2. コマンドラインからの使用

        コマンドラインから,特定のファイルを実行したり,または,PHP コードを直接実行することが可能です.たとえば,ファイル echo.php の内容が,
      <?php
      	echo "test\n";
      ?>
      				
      であった場合,コマンドラインから,
      php echo.php
      				
      と入力すると,echo.php の内容が実行されます.また,コマンドラインから,
      php -r "echo 'test\n';"
      				
      のよう入力し,PHP コードを直接実行することも可能です.

静岡理工科大学 菅沼ホーム PHP 目次 索引