トップ > php > 

PHPクラス・オブジェクト指向解説|現場で使える実践リファレンス

PHPクラス・オブジェクト指向解説|現場で使える実践リファレンス

PHPクラスの全機能を一挙公開。継承、抽象クラス、clone、明示的なインスタンス解放など。基本構文から高度なオブジェクト操作まで、現場品質のサンプルプログラムを掲載。

クラス 目次

  1. クラス
    1. クラスのプロパティ、メソッドのスコープ
    2. インスタンスの生成
    3. クラスのプロパティ、メソッドのスコープ(アクセス修飾子)
    4. private プロパティ
    5. protected プロパティ

PHPのクラス

インスタンスの生成

インスタンスは new 命令を使用し生成する。

<?php
class MyClass {
}

$mycls = new MyClass();	/* クラスのインスタンスを生成 */
?>

クラスのプロパティ、メソッドのスコープ(アクセス修飾子)

  1. public
    クラス内、クラス外のどこからでもアクセス可能。※アクセス修飾子の省略が可能(アクセス修飾子を記述しない場合は自動的にpublicとして扱われる。「可読性」「メンテナンス性」を担保するため public は必ず記述する)。
  2. private
    宣言したクラス内のみアクセス可能。
  3. protected
    クラス内と、そのクラスの親クラス、継承した子クラスからのアクセスが可能。
  4. static
    クラスのインスタンス化なしでアクセス可能。
  5. アクセス修飾子なし
    全て public になる。
クラスのプロパティ、メソッドのスコープ(アクセス修飾子)
publicprotectedprivate宣言なしvar 非推奨
親クラス×
自クラス
子孫クラス×
インスタンス××

private プロパティ

private で宣言したプロパティ、メソッドは、宣言したクラス内のみアクセス可能である。

以下のコードは、クラス内で private $name を宣言し、クラス内のメソッドから $this->name で アクセスしている。

重要なポイントは、クラスのプロパティである $this->name と、クラスのメソッド内(引数)で定義した ローカル変数 $name を使い分けている点だ。

同じ名前の変数($name)でも、プロパティとメソッド内のローカル変数は別の扱いとなる。

※ $this->name は オブジェクトのプロパティだが、$this->$name は 可変プロパティ になるので注意が必要。

Java、C#などの厳格な言語仕様のプログラミング言語と比較し、PHPは言語仕様書がなく、公式ドキュメント(PHP Manual)や実際の動作(挙動)が事実上の仕様として扱われてきた歴史を持っている。

$this->$name に似たような記述は、バグの温床になるので、厳格な言語仕様のプログラミング言語ではできない(コンパイルエラー)。

<?php
class MyClass {
	private $name;	/* private変数を定義 */

	function setName($name) {
		$this->name = $name;	/* private変数 $name に setNameの引数 $name の内容を代入*/
					/*
					$thisはクラス内のプロパティやメソッドにアクセスできる。

					$this->name = $name の左辺の $this->name は
					クラス冒頭で定義された private $name を指している。

					$this->name = $name の右辺の $name は
					function setName($name) 引数 $name を指している。
					*/
	}
	function getName() {
		return $this->name;	/* private変数 $name の値を返す */
	}
}

$mycls = new MyClass();		/* クラスのインスタンスを作成 */
$mycls->setName('hogehoge');	/* setName()メソッドに値を設定する */
echo $mycls->getName();		/* getName()メソッドで値を取得し出力する */
?>

protected プロパティ

protected で宣言したプロパティ、メソッドは、宣言したクラス内、親クラス、継承したクラスからアクセス可能である。インスタンスからアクセスはできない。

以下のコードは、クラス内で protected $name を宣言し、クラス内のメソッドから $this->name で アクセスしている。

$mycls = new MyClass(); で MyClass のインスタンス $mycls を作成し、$mycls->getName(); で getName メソッドの呼び出しを行っている。

コメントアウトしている echo $mycls->name; は、protected プロパティに外部からアクセスしているのでパースエラーが発生する。

パースエラー(構文エラー)は、PHPがコードをパース(構文解釈)する段階で止まってしまうエラーで、多くの場合、間違った構文 ; の付け忘れ、{} () の閉じ忘れなどを記述して発生する。

パースエラーは致命的なエラーで、コンパイルエラーに相当する。パースエラーが発生した場合、プログラムの実行を停止する。

<?php
class MyClass {
	protected $name;	/* protected変数を定義 */

	function setName() {
		$this->name = 'hogehoge';	/* protected変数 $name に 'hogehoge'を代入*/
	}
	function getName() {
		$this->setName();	/* setName() メソッドを呼び出し */
		echo $this->name;
	}
}
$mycls = new MyClass();	/* クラスのインスタンスを作成 */
$mycls->getName();
/* echo $mycls->name; */
/* ↑コメントアウトしている行は、protected プロパティに外部からアクセスしているのでパースエラーが発生する
パースエラー(構文エラー)とはPHPがコードをパース(構文解釈)する段階で止まってしまうエラー */
?>

おすすめ記事

10日で使えるPHP | 未経験のサルでも分かるPHPの学習サイト 10日で使えるPHP | 未経験のサルでも分かるPHPの学習サイト

文系未経験、サルでも10日でPHPを使えるように内容を構成した独学向け学習サイト。不要な基礎はバッサリ切り捨て必要な基礎を十分に深堀した・・・  続きを見る 

Copyright (C) 2001~2026年 e-elder.jp All Rights Reserved. Update 2026年2月27日
運営者情報 ご質問はこちらへお願いします info@e-elder.jp