PHP

PHP基礎(11)変数たち


変数たち

変数には大きく分けて、インスタンス変数(privateなメンバ変数=プロパティ)、クラス変数(staticプロパティ)、ローカル変数、グローバル変数の4つがあります。

各々は、下記のようなルールでその使い所や、スコープ(有効範囲)が決まります。


1.インスタンス変数

インスタンス変数はインスタンスごとに独立して値が保持される変数です。同じクラスの複数のインスタンス同士で異なる値になります。

インスタンス変数の使い方として典型的なのは、コンストラクタ(__construct)で受けた引数を使ってインスタンス変数を初期代入し、その後、それぞれのインスタンスメソッドで参照・変更される使い方です。

作り方としては、クラス内にprivateの変数として宣言し、この変数の参照・代入が必要なメソッドでは$this->変数名で参照します。

<?php

/* 四角クラス */
class Square {
/* 縦 */
private $height;
/* 横 */
private $width;
function __construct($height,$width) {
$this->height = $height;
$this->width = $width;
}

/* 面積計算 */
function calcArea() {
return $this->height * $this->width;
}
}

//呼び出し
$sq = new Square(40,20);
$area = $sq->calcArea();
echo "area = $area ";// => 800

$sq2 = new Square(4,3);
$area = $sq2->calcArea();
echo "area = $area ";// => 12

$area = $sq->calcArea();
echo "area = $area ";// => 800
?>

ただこのインスタンス変数はstaticと付けたクラスメソッドからは呼べません。

下記はエラーになります。静的な領域からインスタンス変数は呼べないのです。

<?php

/* 四角クラス */
class Square {
/* 縦 */
private $height;
/* 横 */
private $width;
function __construct($height,$width) {
$this->height = $height;
$this->width = $width;
}

/* 面積計算 */
public static function calcArea() {
return $this->height * $this->width;// ここでエラー
}
}

//呼び出し
$area = Square::calcArea();
echo "area = $area ";
?>


2.クラス変数

クラスの静的変数はそのクラスの全てのインスタンスで共有される変数で、同一クラスのインスタンス間で共有変数になります。staticプロパティとも言います。

インスタンス間で共有されるので、そのクラス固有の唯一の変数として扱えます。

<?php

/* 四角クラス */
class Square {
/* 縦 */
public static $height;
/* 横 */
public static $width;
function __construct($height,$width) {
self::$height = $height;
self::$width = $width;
}

/* 面積計算 */
function calcArea() {
return self::$height * self::$width;
}
}

//呼び出し
$sq = new Square(40,20);
$area = $sq->calcArea();
echo "area = $area ";// => 800

$sq2 = new Square(4,3);
$area = $sq2->calcArea();
echo "area = $area ";// => 12

$area = $sq->calcArea();
echo "area = $area ";// => 12
?>


3.ローカル変数

メソッドの中をスコープとする、変数名に$を付けた形で宣言される普通の変数です。メソッドの引数もメソッドの中で生きられるローカル変数です。


4.グローバル変数

関数の外で初期化した変数を関数の中で使うときはglobal文を使ってその変数を参照します。


<?php
$a = 1;
$b = 2;
function sum()
{
global $a, $b;

$b = $a + $b;
}
sum();
echo $b;
?>

関数の外と内では変数スコープ(有効範囲)が異なるという意味です。


演習

2-7-1)

適当なクラスを作り、インスタンス変数を定義し、そのクラスのコンストラクタと、任意のメソッドの中でそのインスタンス変数の値を変更、表示できることを確認して下さい。

2-7-2)

2-7-1で作ったクラスを別のインスタンスとしてメソッドを呼び出し、インスタンス変数が共有化されていないことを確認して下さい。

2-7-3)

2-7-2で作ったクラスの中で、静的変数を定義し、任意のメソッドの中でその値を変更、表示できることを確認して下さい。

2-7-4)

2-7-3で作ったクラスを別のインスタンスとしてメソッドを呼び出し、クラス変数が共有化されていることを確認して下さい。

<<PHP基礎(10)公開レベル

PHP基礎(12)カプセル化>>