プロパティ
クラスのメンバ変数のことを プロパティ といいます。
それ以外に 属性 や フィールド などという呼びかたを見たことがあるかもしれません。
しかし、このマニュアルでは プロパティ と呼ぶことにします。
プロパティを定義するには public
、protected
あるいは private
のいずれかのキーワードのあとに、オプションの型宣言を続け、
そして通常の変数の宣言を続けます。
宣言時に初期値を設定することもできますが、初期値は定数値でなければなりません。
つまり、コンパイル時に評価可能な値でなければならず、
実行時の情報がないと評価できない値であってはいけないということです。
public
、protected
そして private
についての詳しい情報は
アクセス権 を参照ください。
注意:
PHP 4 との互換性を考慮して、PHP 5 でも
var
を使ったプロパティの宣言が可能です。これはpublic
やprotected
、private
と組み合わせて使うこともできます。 しかし、もはやvar
は必須ではありません。 PHP 5.0 から 5.1.3 までのバージョンでは、var
の使用は非推奨とされており、E_STRICT
警告が発生していました。 しかし PHP 5.1.3 以降は非推奨ではなくなり、警告も出なくなっています。
public
やprotected
、private
のかわりにvar
を使ってプロパティを宣言した場合、PHP 5 はそれをpublic
と同等とみなします。
クラスメソッドから静的でないプロパティにアクセスするには
->
(オブジェクト演算子) を使って
$this->property
のようにします
(property
のところにプロパティ名を指定します)。
静的なプロパティへのアクセスには ::
(ダブルコロン)
を使って self::$property
のようにします。
静的なプロパティとそうでないプロパティの違いについては、
static キーワード を参照ください。
クラスメソッドがオブジェクトのコンテキストからコールされたときには、
擬似変数 $this
が常に使えます。
$this
は、呼び出し元のオブジェクト
(通常はそのメソッドが属するオブジェクトですが、別のオブジェクトになる可能性もあります。
別のオブジェクトのコンテキストから 静的に
コールされた場合などです) への参照となります。
例1 プロパティの宣言
<?phpclass SimpleClass{ // PHP 5.6.0 以降で使える方式 public $var1 = 'hello ' . 'world'; // PHP 5.3.0 以降で使える方式 public $var2 = <<<EODhello worldEOD; // PHP 5.6.0 以降で使える方式 public $var3 = 1+2; // 無効なプロパティ宣言 public $var4 = self::myStaticMethod(); public $var5 = $myVar; // 有効なプロパティ宣言 public $var6 = myConstant; public $var7 = array(true, false); // PHP 5.3.0 以降で使える方式 public $var8 = <<<'EOD'hello worldEOD;}?>
注意:
クラスやオブジェクトを操作するための便利な関数が用意されています。 クラス/オブジェクト関数 を参照ください。
ヒアドキュメント と Nowdoc
PHP 5.3.0 以降、 ヒアドキュメント や Nowdoc は任意の静的データコンテキストで使えます。プロパティの宣言時にも使用可能です。
例2 Nowdoc を使ったプロパティの初期化
<?phpclass foo { // PHP 5.3.0 以降 public $bar = <<<'EOT'barEOT; public $baz = <<<EOTbazEOT;}?>
注意:
Nowdoc とヒアドキュメントは PHP 5.3.0 以降で使用可能です。
型宣言
PHP 7.4.0 以降は、プロパティの定義に型宣言を含めることができます。
但し、callable
型を除きます。
例3 型付きプロパティの例
<?phpclass 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 がスローされます。
例4 プロパティにアクセスする
<?phpclass 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
有効なプロパティの型
型 | 説明 | 必要なPHPのバージョン |
---|---|---|
bool | プロパティの値は bool 型でなければなりません。 | PHP 7.4.0 |
int | プロパティの値は int 型でなければなりません。 | PHP 7.4.0 |
float | プロパティの値は float (浮動小数点型の数値) 型でなければなりません。 | PHP 7.4.0 |
string | プロパティの値は string 型でなければなりません。 | PHP 7.4.0 |
array | プロパティの値は array 型でなければなりません。 | PHP 7.4.0 |
object
|
プロパティの値は object 型でなければなりません。 | PHP 7.4.0 |
iterable
|
プロパティの値は、array 型か、
Traversable のインスタンスでなければなりません。 |
PHP 7.4.0 |
self
|
プロパティの値は、プロパティが定義されたクラスのインスタンスでなければなりません。 | PHP 7.4.0 |
parent
|
プロパティの値は、プロパティが定義されたクラスの親クラスのインスタンスでなければなりません。 | PHP 7.4.0 |
Class/interface name | プロパティの値は、指定したクラスまたはインターフェイスのインスタンスでなければなりません。 | PHP 7.4.0 |
?type | プロパティの値は、指定された型か、 null でなければなりません。
|
PHP 7.4.0 |