Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

PHP辞典

  1. トップページ
  2. PHP辞典
  3. public / private / protected / static

public / private / protected / static対応: PHP 5(2004)

クラスのプロパティやメソッドへのアクセス範囲を制御するキーワードです。カプセル化を実現してコードの安全性を高めます。

構文
class クラス名 {
	public $prop1;     // どこからでもアクセス可能
	protected $prop2;  // 自クラスと子クラスからアクセス可能
	private $prop3;    // 自クラスのみアクセス可能

	public static $count = 0;    // 静的プロパティ
	public const VERSION = '1.0'; // クラス定数

	public static function staticMethod() {
		// 静的メソッド。インスタンスなしで呼び出せます。
	}
}
構文一覧
構文概要
publicどこからでもアクセスできます。クラスの外部、子クラス、すべての場所からアクセス可能です。
protected自クラスと子クラスからのみアクセスできます。クラスの外部からはアクセスできません。
private定義されたクラスの内部からのみアクセスできます。子クラスからもアクセスできません。
staticインスタンスを生成せずにクラス名から直接アクセスできるプロパティやメソッドを定義します。
constクラス内に定数を定義します。値の変更はできません。
サンプルコード
<?php
// アクセス修飾子の基本的な使い方です。
class BankAccount {
	public string $owner;
	private int $balance;
	protected string $bank_name;

	public function __construct(string $owner, int $balance, string $bank_name) {
		$this->owner = $owner;
		$this->balance = $balance;
		$this->bank_name = $bank_name;
	}

	public function get_balance(): int {
		return $this->balance; // private プロパティにはメソッド経由でアクセスします。
	}

	public function deposit(int $amount): void {
		if ($amount > 0) {
			$this->balance += $amount;
		}
	}
}

$account = new BankAccount("太郎", 10000, "テスト銀行");
echo $account->owner;          // public なのでアクセスできます。
echo $account->get_balance();  // 『10000』と出力されます。
// echo $account->balance;     // private なのでエラーになります。

// static の使い方です。
class Counter {
	private static int $count = 0;

	public static function increment(): void {
		self::$count++; // 静的プロパティには self:: でアクセスします。
	}

	public static function get_count(): int {
		return self::$count;
	}
}

Counter::increment(); // インスタンスなしで呼び出せます。
Counter::increment();
echo Counter::get_count(); // 『2』と出力されます。

// クラス定数の使い方です。
class HttpStatus {
	public const OK = 200;
	public const NOT_FOUND = 404;
	public const SERVER_ERROR = 500;
}

echo HttpStatus::OK;        // 『200』と出力されます。
echo HttpStatus::NOT_FOUND; // 『404』と出力されます。

// PHP 8.0 のコンストラクタプロモーションとアクセス修飾子を組み合わせた例です。
class Config {
	public function __construct(
		public readonly string $app_name,
		private readonly string $secret_key,
		protected int $max_retry = 3
	) {}

	public function get_masked_key(): string {
		return str_repeat('*', strlen($this->secret_key) - 4)
			. substr($this->secret_key, -4);
	}
}

$config = new Config("MyApp", "sk_live_abcdefgh1234");
echo $config->app_name;         // 『MyApp』と出力されます。
echo $config->get_masked_key(); // 『****************1234』と出力されます。

// ファクトリメソッドパターンの例です。
class Logger {
	private static ?Logger $instance = null;

	private function __construct(
		private string $log_file
	) {}

	public static function getInstance(): Logger {
		if (self::$instance === null) {
			self::$instance = new self('/var/log/app.log');
		}
		return self::$instance;
	}

	public function info(string $message): void {
		echo "[INFO] $message\n";
	}
}

$logger = Logger::getInstance();
$logger->info("アプリケーションが起動しました。");
概要

アクセス修飾子はクラスのカプセル化を実現するための仕組みです。原則として、プロパティは『private』または『protected』にし、必要に応じて『public』なメソッドを通じてアクセスさせる設計が推奨されます。これにより、クラス内部の実装を変更しても外部に影響を与えにくくなります。

『static』はインスタンスに属さないプロパティやメソッドを定義します。ユーティリティ関数やシングルトンパターン、ファクトリメソッドなどで使用されますが、テストが困難になる場合があるため多用は避けてください。

クラスの基本については『class』、継承とインターフェースについては『extends / implements』、定数の定義全般については『define() / const』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。