class / new / $this
| 対応: | PHP 5(2004) |
|---|
クラスを定義してオブジェクトを生成するための基本構文です。データと処理をひとまとめにしたオブジェクト指向プログラミングの土台となります。
構文
// クラスを定義します
class クラス名 {
// プロパティの宣言
public $property;
// コンストラクター
public function __construct($param) {
$this->property = $param;
}
// メソッドの定義
public function method() {
return $this->property;
}
}
// インスタンスを生成します
$obj = new クラス名($value);
構文一覧
| 構文 | 概要 |
|---|---|
| class | クラスを定義するキーワードです。プロパティとメソッドをまとめた設計図を作成します。 |
| new | クラスからインスタンスを生成するキーワードです。生成時に『__construct()』が自動的に呼び出されます。 |
| $this | インスタンス自身を参照する特殊変数です。メソッド内で自分のプロパティやメソッドにアクセスする際に使用します。 |
| __construct() | コンストラクターです。『new』でインスタンスを生成した際に自動的に実行され、初期化処理を行います。 |
| __destruct() | デストラクターです。オブジェクトが破棄される際に自動的に実行され、後片付け処理を行います。 |
サンプルコード
sample_class.php
<?php
// 基本的なクラスの定義
class Fighter {
public string $name;
public int $power;
public function __construct(string $name, int $power) {
$this->name = $name;
$this->power = $power;
}
public function greet(): string {
return "俺は{$this->name}。戦闘力は{$this->power}だ。";
}
}
$fighter = new Fighter("八神庵", 950);
echo $fighter->greet(); // 『俺は八神庵。戦闘力は950だ。』と出力されます
echo $fighter->name; // 『八神庵』と出力されます
// コンストラクタプロモーション(PHP 8.0 以降)を使うと、より簡潔に書けます
class KofCharacter {
public function __construct(
public string $name,
public string $team,
public string $special = ''
) {}
public function profile(): string {
return "{$this->name}({$this->team}チーム)";
}
}
$kyo = new KofCharacter("草薙京", "日本", "八稚女");
echo $kyo->profile(); // 『草薙京(日本チーム)』と出力されます
echo $kyo->name; // 『草薙京』と出力されます
// デストラクターの例
class FileHandler {
private $handle;
public function __construct(string $path) {
$this->handle = fopen($path, 'r');
echo "ファイルを開きました。\n";
}
public function __destruct() {
if ($this->handle) {
fclose($this->handle);
}
echo "ファイルを閉じました。\n";
}
}
$file = new FileHandler("/tmp/test.txt");
unset($file); // デストラクターが実行されます
// メソッドチェーンのビルダーパターン
class FighterBuilder {
private string $name = '';
private int $power = 0;
private string $special = '';
public function setName(string $name): self {
$this->name = $name;
return $this; // $this を返すことでチェーンを実現します
}
public function setPower(int $power): self {
$this->power = $power;
return $this;
}
public function setSpecial(string $special): self {
$this->special = $special;
return $this;
}
public function build(): Fighter {
return new Fighter($this->name, $this->power);
}
}
$terry = (new FighterBuilder())->setName('テリー・ボガード')->setPower(900)->setSpecial('パワーウェイブ')->build();
echo $terry->greet(); // 『俺はテリー・ボガード。戦闘力は900だ。』と出力されます
php sample_class.php 俺は八神庵。戦闘力は950だ。八神庵草薙京(日本チーム)草薙京ファイルを開きました。 ファイルを閉じました。 俺はテリー・ボガード。戦闘力は900だ。
$thisは静的メソッドから使えない
『static』修飾子が付いたメソッド内では『$this』は使えません。静的メソッドはインスタンスに紐づかないため、インスタンス自身を指す『$this』が存在しないからです。静的プロパティへのアクセスには『self::』を使います。
<?php
class KofTeam {
private static string $name = 'KOFチーム';
public static function getName(): string {
// return $this->name; // エラー: 静的メソッド内では $this は使えません
return self::$name; // 正しい: self:: で静的プロパティにアクセスします
}
}
echo KofTeam::getName(); // 『KOFチーム』と出力されます
コンストラクタを定義しないと引数なしで呼べる
『__construct()』を定義しない場合、引数なしで『new』できますが、プロパティが未初期化の状態になりやすいです。意図しない空のオブジェクトが生成されないように、必要なプロパティはコンストラクタで受け取るよう設計するとよいでしょう。
<?php
// コンストラクタなし: 引数なしでインスタンスを生成できてしまいます
class BlueMaryStat {
public string $name;
public int $power;
}
$stat = new BlueMaryStat(); // エラーにならずに生成できます
// echo $stat->name; // 初期化されていないため Warning が発生します
<?php
// コンストラクタあり: 必要なデータを強制できます
class BlueMaryStat {
public string $name;
public int $power;
public function __construct(string $name, int $power) {
$this->name = $name;
$this->power = $power;
}
}
$stat = new BlueMaryStat("ブルー・マリー", 820);
echo $stat->name; // 『ブルー・マリー』と出力されます
オブジェクトは参照型として動作する
オブジェクトを変数に代入すると、値のコピーではなく参照がコピーされます。そのため片方を変更するともう片方にも影響します。独立したコピーが必要な場合は『clone』演算子を使います。
<?php
class Fighter {
public function __construct(public string $name, public int $power) {}
}
$king = new Fighter("キング", 870);
$copy = $king; // 参照がコピーされます(値コピーではありません)
$copy->power = 900;
echo $king->power; // 『900』と出力されます(元のオブジェクトも変わっています)
<?php
class Fighter {
public function __construct(public string $name, public int $power) {}
}
$king = new Fighter("キング", 870);
$clone = clone $king; // 独立したコピーを作成します
$clone->power = 900;
echo $king->power; // 『870』と出力されます(元のオブジェクトは変わりません)
echo $clone->power; // 『900』と出力されます
実践パターン
KOFファイタークラスの設計
name(名前)・power(戦闘力)・special(必殺技)などのプロパティを持つファイタークラスを設計し、複数のファイターを管理する例です。
<?php
class KofFighter {
private string $name;
private int $power;
private string $special;
public function __construct(string $name, int $power, string $special) {
$this->name = $name;
$this->power = $power;
$this->special = $special;
}
public function getName(): string {
return $this->name;
}
public function getPower(): int {
return $this->power;
}
public function attack(): string {
return "{$this->name}の{$this->special}!";
}
public function powerUp(int $amount): void {
$this->power += $amount;
}
}
$iori = new KofFighter("八神庵", 950, "八稚女");
$kyo = new KofFighter("草薙京", 930, "裏百八式・大蛇薙");
echo $iori->attack(); // 『八神庵の八稚女!』と出力される
$iori->powerUp(50);
echo $iori->getPower(); // 『1000』と出力される
// 複数のファイターを配列で管理する
$fighters = [$iori, $kyo, new KofFighter("テリー・ボガード", 900, "バスターウルフ")];
foreach ($fighters as $f) {
echo $f->getName() . ": " . $f->getPower() . "\n";
}
php sample_class.php 八神庵の八稚女!1000八神庵: 1000 草薙京: 930 テリー・ボガード: 900
メソッドチェーンのビルダーパターン
各設定メソッドが『$this』を返すことで、メソッドを連続して呼び出せるビルダーパターンです。複数の省略可能なパラメータを持つオブジェクトの構築に向いています。
<?php
class KofFighter {
private string $name = '';
private int $power = 0;
private string $special = '';
public function __construct(string $name, int $power) {
$this->name = $name;
$this->power = $power;
}
}
class KofFighterBuilder {
private string $name = '';
private int $power = 0;
private string $special = '';
public function setName(string $name): self {
$this->name = $name;
return $this;
}
public function setPower(int $power): self {
$this->power = $power;
return $this;
}
public function setSpecial(string $special): self {
$this->special = $special;
return $this;
}
public function build(): KofFighter {
return new KofFighter($this->name, $this->power);
}
}
$mary = (new KofFighterBuilder())
->setName('ブルー・マリー')
->setPower(820)
->setSpecial('マリー・スパイラル')
->build();
echo $mary->getName(); // 『ブルー・マリー』と出力される
echo $mary->getPower(); // 『820』と出力される
sample_class_builder.php
php sample_class_builder.php ブルー・マリー820
概要
クラスはオブジェクト指向プログラミングの基本単位で、関連するデータとそれを操作するメソッドをひとまとめにした設計図です。『new』キーワードでインスタンスを生成すると、『__construct()』が自動的に実行されて初期値が設定されます。
PHP 8.0 で導入されたコンストラクタプロモーションを使うと、プロパティの宣言・型指定・代入を1行で記述できます。PHP 8.1 以降では『readonly』修飾子を付けることで、初期化後の変更を禁止できるため、不変オブジェクトの作成に便利です。
アクセス修飾子については『public / private / protected』、継承については『extends / implements』、トレイトについては『trait』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。