Php/docs/language.oop5.properties

提供:Dev Guides
< Php
移動先:案内検索

プロパティ

クラスのメンバ変数のことを プロパティ といいます。 それ以外に 属性フィールド などという呼びかたを見たことがあるかもしれません。 しかし、このマニュアルでは プロパティ と呼ぶことにします。 プロパティを定義するには publicprotected あるいは private のいずれかのキーワードのあとに、オプションの型宣言を続け、 そして通常の変数の宣言を続けます。 宣言時に初期値を設定することもできますが、初期値は定数値でなければなりません。 つまり、コンパイル時に評価可能な値でなければならず、 実行時の情報がないと評価できない値であってはいけないということです。

publicprotected そして private についての詳しい情報は アクセス権 を参照ください。

注意:

PHP 4 との互換性を考慮して、PHP 5 でも var を使ったプロパティの宣言が可能です。これは publicprotectedprivate と組み合わせて使うこともできます。 しかし、もはや var は必須ではありません。 PHP 5.0 から 5.1.3 までのバージョンでは、 var の使用は非推奨とされており、 E_STRICT 警告が発生していました。 しかし PHP 5.1.3 以降は非推奨ではなくなり、警告も出なくなっています。

publicprotectedprivate のかわりに 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