はじめに
PHP8 上級試験では「インターフェイスに定義できるもの/できないもの」を問われる問題がよく出題されます。特に「プロパティをインターフェイスに書けるか?」という誤答パターンに注意が必要です。本記事では、誤答例と実際のエラー挙動、そして正しい書き方を整理します。
目次
誤答例(よくある間違い)
<?php
declare(strict_types=1);
error_reporting(-1);
interface HogeInterface {
private int $num; // ❌ インターフェイスにプロパティはNG
public function setNum(int $i);
}
このコードを実行すると、問題集の解説のように「オブジェクトの中に num が表示される」と思いがちですが、実際には Fatal error で実行が止まります。
Fatal error: Interfaces may not include properties in ...
正しい定義方法
インターフェイスには 定数とメソッドのシグネチャ(必ず public) しか定義できません。
プロパティを持たせたい場合は、実装するクラス側 で宣言します。
<?php
declare(strict_types=1);
error_reporting(-1);
interface HogeInterface {
public function setNum(int $i);
}
class Hoge implements HogeInterface {
private int $num;
public function setNum(int $i) {
$this->num = $i;
}
}
$obj = new Hoge();
$obj->setNum(123);
var_dump($obj);
出力結果:
object(Hoge)#1 (1) {
["num":"Hoge":private]=>
int(123)
}
試験対策まとめ
インターフェイスに書けるもの
- 定数
- publicメソッドのシグネチャ
インターフェイスに書けないもの
- プロパティ
- protected / private メソッド
エラーメッセージを覚えておくと即答できる:
Fatal error: Interfaces may not include properties