クラスのメンバ変数のことを プロパティ といいます。
それ以外に フィールド などという呼びかたを見たことがあるかもしれません。
しかし、このマニュアルでは プロパティ と呼ぶことにします。
プロパティを定義するには public
、protected
あるいは private
のいずれかのキーワードのあとに、(PHP 7.4 以降のみ)オプションの型宣言を続け、
そして通常の変数の宣言を続けます。
宣言時に初期値を設定することもできますが、
初期値は 定数 値でなければなりません。
public
、protected
そして private
についての詳しい情報は
アクセス権 を参照ください。
注意:
PHP 4 との後方互換性を維持する目的で、 クラスのプロパティを宣言する代替の方法として、
var
を使う方法があります。 これは推奨されません。var
を使ってプロパティを宣言した場合、 その変数はpublic
と同等とみなされます。
クラスのメソッドから静的でないプロパティにアクセスするには
->
(オブジェクト演算子) を使って
$this->property のようにします
(property
のところにプロパティ名を指定します)。
静的なプロパティへのアクセスには ::
(ダブルコロン)
を使って self::$property のようにします。
静的なプロパティとそうでないプロパティの違いについては、
static キーワード を参照ください。
クラスのメソッドがオブジェクトのコンテキストからコールされたときには、 擬似変数 $this が使えます。 $this は、呼び出し元のオブジェクトの値です。
例1 プロパティの宣言
<?php
class SimpleClass
{
public $var1 = 'hello ' . 'world';
public $var2 = <<<EOD
hello world
EOD;
public $var3 = 1+2;
// 無効なプロパティ宣言
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
// 有効なプロパティ宣言
public $var6 = myConstant;
public $var7 = [true, false];
public $var8 = <<<'EOD'
hello world
EOD;
}
?>
注意:
クラスやオブジェクトを操作するための便利な関数が用意されています。 クラス/オブジェクト関数 を参照ください。
PHP 7.4.0 以降は、プロパティの定義に 型宣言 を含めることができます。
但し、callable
型を除きます。
例2 型付きプロパティの例
<?php
class User
{
public int $id;
public ?string $name;
public function __construct(int $id, ?string $name)
{
$this->id = $id;
$this->name = $name;
}
}
$user = new User(1234, null);
var_dump($user->id);
var_dump($user->name);
?>
上の例の出力は以下となります。
int(1234) NULL
型付きプロパティは、アクセスする前に初期化しなければいけません。 初期化しないと、Error がスローされます。
例3 プロパティにアクセスする
<?php
class Shape
{
public int $numberOfSides;
public string $name;
public function setNumberOfSides(int $numberOfSides): void
{
$this->numberOfSides = $numberOfSides;
}
public function setName(string $name): void
{
$this->name = $name;
}
public function getNumberOfSides(): int
{
return $this->numberOfSides;
}
public function getName(): string
{
return $this->name;
}
}
$triangle = new Shape();
$triangle->setName("triangle");
$triangle->setNumberofSides(3);
var_dump($triangle->getName());
var_dump($triangle->getNumberOfSides());
$circle = new Shape();
$circle->setName("circle");
var_dump($circle->getName());
var_dump($circle->getNumberOfSides());
?>
上の例の出力は以下となります。
string(8) "triangle" int(3) string(6) "circle" Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be accessed before initialization