PHPはウェブ開発の現場で長く愛され続けているプログラミング言語の一つです。

その柔軟性の高さから初心者でも扱いやすい一方で、変数の扱いを誤ると予期せぬ不具合を招くこともあります。

本記事では、PHPにおける変数宣言の基礎から、最新のPHPバージョンで推奨されるモダンな書き方までを詳しく解説します。

これからPHPを学ぶ方も、既に実務で利用している方も、変数の適切な扱い方を再確認して堅牢なプログラムを作成しましょう。

PHPにおける変数宣言の基本構造

PHPで変数を扱う際の最も基本的なルールは、変数名の先頭にドル記号($)を付けることです。

他のプログラミング言語とは異なり、PHPでは変数を使い始める際に明示的な宣言(例:C言語のint宣言やJavaScriptのlet宣言など)を必ずしも必要としません。

値を代入した瞬間に、その変数が作成されるという動的な仕組みを持っています。

PHP
<?php
// 変数の代入による宣言
$message = "こんにちは、PHPの世界へ!";
$count = 10;

echo $message;
?>
実行結果
こんにちは、PHPの世界へ!

上記のコードでは、$messageという変数に文字列を、$countという変数に数値を代入しています。

代入演算子である「=」を使用することで、右辺の値を左辺の変数に格納できます。

変数名の命名規則とベストプラクティス

PHPの変数名には、守らなければならない厳格なルールと、推奨される慣習があります。

まず、変数名の1文字目に使用できるのはアルファベットまたはアンダースコア(_)のみです。

数字から始まる変数名は定義できないという点に注意してください。

また、PHPの変数名は大文字と小文字を区別します。 たとえば、$user$Userは全く別の変数として扱われます。

一般的には、複数の単語を組み合わせる場合は「$userName」のようなキャメルケースか、「$user_name」のようなスネークケースのどちらかに統一するのが望ましいでしょう。

PHPで扱える主なデータ型

PHPは動的型付け言語ですが、内部的には複数のデータ型が存在します。

変数がどのようなデータを保持しているかを理解することは、バグの少ないコードを書くための第一歩です。

代表的なデータ型を以下の表にまとめました。

型カテゴリ型名概要
スカラー型string文字列。シングルクォートまたはダブルクォートで囲む。
スカラー型int整数。正負の整数を扱う。
スカラー型float浮動小数点数。小数を含む数値を扱う。
スカラー型bool論理型。trueまたはfalseのいずれかを持つ。
複合型array配列。複数の値をまとめて管理する。
複合型objectオブジェクト。クラスのインスタンス。
特別な型null値が存在しないことを示す。

動的型付けと自動型変換

PHPの大きな特徴は、変数に代入される値に応じてデータ型が自動的に決定される点にあります。

これを動的型付けと呼び、開発者が型を意識せずに素早くコードを書けるメリットがあります。

しかし、意図しない型変換(型強制)が行われることで、計算結果が狂うケースも存在します。

PHP
<?php
$number = "5"; // 文字列型
$result = $number + 10; // 数値として計算される

echo $result;
echo " 型: " . gettype($result);
?>
実行結果
15 型: integer

このように、文字列の「5」が数値として扱われ、計算が行われます。

便利な反面、複雑なロジックでは厳密な型管理が求められるようになります。

型指定(型宣言)による堅牢なコードの作成

近年のPHP開発では、プログラムの信頼性を高めるために「型指定」を積極的に活用することが標準となっています。

特にPHP 7.4以降で導入されたクラスプロパティの型指定や、関数・メソッドの引数、戻り値への型指定は非常に重要です。

これにより、想定外のデータが変数に紛れ込むのを防ぐことができます。

PHP
<?php
class User {
    // プロパティに型を指定する
    public int $id;
    public string $name;

    public function __construct(int $id, string $name) {
        $this->id = $id;
        $this->name = $name;
    }
}

$user = new User(1, "田中太郎");
echo $user->name;
?>

もしここで$idに文字列を渡そうとすると、PHPはエラーを出力して実行を停止します。

厳格な型チェックの有効化

PHPのデフォルト設定では、多少の型の不一致は自動的に補正されてしまいます。

これを完全に禁止し、型に厳格なコードを書くためには、ファイルの先頭でdeclare(strict_types=1);を記述します。

PHP
<?php
declare(strict_types=1);

function add(int $a, int $b): int {
    return $a + $b;
}

// strict_types=1 の場合、以下はエラーになります
// echo add("5", 10); 
?>

モダンなPHP開発において、この宣言は必須レベルのプラクティスと言えます。

変数のスコープと有効期限

宣言した変数が「どこから参照できるか」という有効範囲のことをスコープと呼びます。

PHPには主に「ローカルスコープ」と「グローバルスコープ」の2種類があります。

ローカル変数

関数の中で宣言された変数は、その関数内でのみ有効なローカル変数となります。

関数の外からその変数にアクセスしようとしても、未定義エラーとなります。

PHP
<?php
function testScope() {
    $localValue = "関数内のみ有効";
}

testScope();
// echo $localValue; // これはエラーになります
?>

グローバル変数

関数の外で宣言された変数は、グローバルスコープを持ちます。

ただし、関数の中からグローバル変数にアクセスするには、globalキーワードを使用する必要があります。

PHP
<?php
$globalValue = "外側の変数";

function showGlobal() {
    global $globalValue;
    echo $globalValue;
}

showGlobal();
?>

ただし、グローバル変数の多用はプログラムの構造を複雑にし、メンテナンス性を低下させます。

可能な限り、引数や戻り値を利用してデータの受け渡しを行うように設計しましょう。

変数の初期化と未定義エラーへの対策

PHPでは変数を初期化せずに使用しようとすると、警告(Warning)やエラーが発生します。

特に条件分岐の中で変数を宣言する場合、その条件を通らなかった時に変数が存在しない状態になるリスクがあります。

PHP
<?php
// 悪い例
if (false) {
    $status = "OK";
}
// echo $status; // 未定義エラーのリスク

// 良い例:デフォルト値で初期化しておく
$status = "NG";
if (true) {
    $status = "OK";
}
echo $status;
?>

変数は「使う前に必ず初期化する」という習慣を身につけることが重要です。

変数の存在確認を行う便利な関数

変数が定義されているかどうかを安全に確認するために、PHPにはいくつかの組み込み関数が用意されています。

  • isset($var):変数が宣言されており、かつnullでない場合にtrueを返します。
  • empty($var):変数が空(空文字、0、false、null、空の配列など)である場合にtrueを返します。
  • is_null($var):変数がnullである場合にtrueを返します。

特に外部からの入力データ(フォーム送信値など)を扱う際には、これらの関数によるチェックが欠かせません。

定数の宣言:値を変更させない仕組み

プログラムの実行中に値を変更したくない場合は、変数ではなく定数を使用します。

定数にはdefine()関数を使用する方法と、constキーワードを使用する方法の2通りがあります。

PHP
<?php
// defineを使用した定数
define("TAX_RATE", 0.1);

// constを使用した定数(クラス内などでも利用可能)
const APP_NAME = "MyPHPApp";

echo TAX_RATE;
echo APP_NAME;
?>

定数名は慣習としてすべて大文字で記述し、単語間をアンダースコアで繋ぎます。

定数は一度宣言すると値を書き換えることができないため、設定値や税率などの固定データに最適です。

読み取り専用プロパティ(readonly)

PHP 8.1から導入されたreadonlyプロパティは、宣言時に一度だけ値を代入でき、その後は変更を禁止する機能です。

これは「変数の柔軟性」と「定数の安全性」を両立させたような機能で、データオブジェクト(DTO)の作成に非常に役立ちます。

PHP
<?php
class Post {
    public function __construct(
        public readonly string $title,
        public readonly string $content
    ) {}
}

$post = new Post("タイトル", "本文の内容です");
// $post->title = "変更不可"; // エラーが発生します
?>

このように、プロパティを読み取り専用にすることで、意図しないデータの改ざんを防ぐことができます。

変数宣言におけるモダンな推奨事項

現代のPHP開発において、推奨される変数宣言のポイントをまとめます。

第一に、変数のスコープを最小限に留めることです。

長い関数の中で多くの変数を使うのではなく、小さな関数に分割して、その中だけで完結する変数を増やすようにしましょう。

第二に、マジックナンバーを避け、意味のある名前を付けることです。

$val1$dataといった抽象的な名前ではなく、$targetUserEmailのように中身が推測できる名前を選んでください。

第三に、可能な限り型指定(Type Hinting)を導入することです。

これにより、コード自体がドキュメントの役割を果たし、エディタの補完機能も最大限に活用できるようになります。

まとめ

PHPの変数宣言は非常にシンプルでありながら、奥が深い要素です。

$記号から始まる基本ルールを守るだけでなく、データ型、スコープ、そして最新の型指定機能を組み合わせることで、プロフェッショナルなコードへと進化します。

動的型付けの利便性を活かしつつ、strict_typesreadonlyを活用して安全性を高めるのが、現代的なPHP開発の王道です。

本記事で紹介した基本ルールと推奨される書き方を意識して、今後のプログラミングに役立ててください。

適切な変数宣言こそが、バグの少ない、メンテナンス性の高いアプリケーションへの第一歩となります。