1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PHPのアクセス修飾子でクイズ

Last updated at Posted at 2022-07-31

はじめに

PHPでクイズを作りたいと思い、間違いやすそうな部分を問題にしました。

PHPのアクセス修飾子

// PHPのバージョンは8.0.3とする
class Super {
  // public、protected、privateそれぞれのパターン
  アクセス修飾子 $name;

  public function __construct(string $name)
  {
    $this->setName($name);
  }

  public function setName(string $name): void
  {
    $this->name = $name;
  }

  public function getName(): string
  {
    return $this->name;
  }
}

class Sub extends Super {
  public function __construct(string $name)
  {
    parent::__construct($name);
  }
}

$sub = new Sub('佐藤さん');
$sub->name = '鈴木さん';
$sub->setName('高橋さん');
// 出力結果
echo $sub->getName();

問題

Superクラスの$nameがpublic、protected、privateのそれぞれのケースでの出力結果を下記の選択肢から選んでください。

1.エラーが表示される
2.佐藤さんが表示される
3.鈴木さんが表示される
4.高橋さんが表示される

解答

publicの場合

表示

4.高橋さんが表示される

解説
最後の$sub->setName('高橋さん')
Superクラスの$nameへセットされて表示される。

protectedの場合

表示

1.エラーが表示される

解説
エラー内容は
Fatal error: Uncaught Error: Cannot access protected property Sub::$name
原因は下記のコードでprotected自身のクラスと自身のクラスを継承したクラスと
親クラスからのみでしかアクセスできないため、エラー
となる。

privateの場合

表示

3.鈴木さんが表示される

解説
結果から$nameはSuperクラスとSubクラスの両方で所持されている。

Subクラスの$nameは、最初は定義されていないが、
PHPは未定義のプロパティに対して動的に生成する
ため、
$user->name = '鈴木さん'この段階でSubクラスに存在する。

Superクラスの$nameは、
$sub = new Sub('佐藤さん')$sub->setName('高橋さん')の2回セットされており
最後にセットされた高橋さんが値がセットされている。

出力するときはSubクラスで生成されたpublic $nameにアクセスされる。

※なお、動的プロパティはPHP 8.2では非推奨になり、PHP9.0ではエラーとなる模様。
https://wiki.php.net/rfc/deprecate_dynamic_properties

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?