プロパティ

クラスのメンバ変数のことを プロパティ といいます。 それ以外に フィールド などという呼びかたを見たことがあるかもしれません。 しかし、このマニュアルでは プロパティ と呼ぶことにします。 プロパティを定義するには publicprotected あるいは private のいずれかのキーワードのあとに、(PHP 7.4 以降のみ)オプションの型宣言を続け、 そして通常の変数の宣言を続けます。 宣言時に初期値を設定することもできますが、 初期値は 定数 値でなければなりません。

publicprotected そして 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 = [truefalse];

   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(1234null);

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