[PHP]phpversion関数の使い方を完全解説!バージョン情報を取得する方法

PHP

はじめに

PHPアプリケーションを開発していると、「このコードは現在のPHPバージョンで動作するのか?」「特定の拡張機能のバージョンは?」といった疑問に直面することがありますよね。

バージョン互換性の確認は、特に以下のような場面で重要です:

  • 新しいPHP機能を使う前のバージョンチェック
  • 本番環境と開発環境のバージョン差異の確認
  • 拡張機能の動作確認
  • セキュリティパッチの適用確認

そんな時に活躍するのが**phpversion関数**です。この関数を使えば、PHPのバージョン情報や拡張機能のバージョンを簡単に取得できます。

この記事では、phpversionの基本から実践的な活用方法まで、詳しく解説します。

phpversionとは?

phpversionは、現在実行中のPHPのバージョン情報、または特定の拡張機能のバージョンを返す関数です。

基本構文

phpversion(?string $extension = null): string|false

パラメータ

  • $extension (オプション): 拡張機能の名前
    • 指定しない場合: PHPのバージョンを返す
    • 指定した場合: その拡張機能のバージョンを返す

戻り値

  • 成功時: バージョン文字列(例: “8.2.10”)
  • 失敗時: false(拡張機能が存在しない場合)

対応バージョン

  • PHP 4.0.0 以降で使用可能
  • 拡張機能のバージョン取得は全バージョンで利用可能

基本的な使い方

PHPバージョンの取得

<?php
// 方法1: phpversion()関数
$version = phpversion();
echo "PHPバージョン: {$version}\n";

// 方法2: PHP_VERSION定数(推奨)
echo "PHPバージョン: " . PHP_VERSION . "\n";

// 出力例:
// PHPバージョン: 8.2.10
?>

拡張機能のバージョン取得

<?php
// MySQLi拡張機能のバージョン
$mysqli_version = phpversion('mysqli');
if ($mysqli_version) {
    echo "MySQLi: {$mysqli_version}\n";
} else {
    echo "MySQLi拡張機能はインストールされていません\n";
}

// PDO拡張機能のバージョン
$pdo_version = phpversion('pdo');
if ($pdo_version) {
    echo "PDO: {$pdo_version}\n";
}

// 出力例:
// MySQLi: 8.2.10
// PDO: 8.2.10
?>

バージョン番号の比較

<?php
// バージョンチェック
if (version_compare(phpversion(), '8.0.0', '>=')) {
    echo "PHP 8.0以降が利用可能です\n";
    // PHP 8の機能を使用可能
} else {
    echo "PHP 8.0未満です\n";
    // 古いバージョン用の処理
}
?>

実践的な使用例

例1: 環境情報の表示

<?php
function displayEnvironmentInfo() {
    echo "=== PHP環境情報 ===\n\n";
    
    // PHPバージョン
    echo "PHPバージョン: " . phpversion() . "\n";
    echo "PHP_VERSION: " . PHP_VERSION . "\n";
    echo "PHP_VERSION_ID: " . PHP_VERSION_ID . "\n";
    
    // メジャー・マイナー・リリースバージョン
    echo "\nバージョン詳細:\n";
    echo "  メジャー: " . PHP_MAJOR_VERSION . "\n";
    echo "  マイナー: " . PHP_MINOR_VERSION . "\n";
    echo "  リリース: " . PHP_RELEASE_VERSION . "\n";
    
    // 追加情報
    echo "\nその他:\n";
    echo "  SAPI: " . PHP_SAPI . "\n";
    echo "  OS: " . PHP_OS . "\n";
    echo "  OS Family: " . PHP_OS_FAMILY . "\n";
}

displayEnvironmentInfo();
?>

例2: 拡張機能の一覧とバージョン

<?php
function listExtensionsWithVersions() {
    $extensions = get_loaded_extensions();
    sort($extensions);
    
    echo "=== インストール済み拡張機能 ===\n\n";
    echo sprintf("%-25s %s\n", "拡張機能名", "バージョン");
    echo str_repeat("-", 50) . "\n";
    
    foreach ($extensions as $ext) {
        $version = phpversion($ext);
        $version_str = $version ? $version : '(不明)';
        echo sprintf("%-25s %s\n", $ext, $version_str);
    }
    
    echo "\n総数: " . count($extensions) . "個\n";
}

listExtensionsWithVersions();
?>

例3: バージョン互換性チェッカー

<?php
class VersionChecker {
    private $requirements = [];
    
    public function requirePHP($min_version, $max_version = null) {
        $this->requirements['php'] = [
            'min' => $min_version,
            'max' => $max_version,
            'current' => phpversion()
        ];
        return $this;
    }
    
    public function requireExtension($extension, $min_version = null) {
        $current = phpversion($extension);
        $this->requirements['ext_' . $extension] = [
            'name' => $extension,
            'min' => $min_version,
            'current' => $current,
            'installed' => $current !== false
        ];
        return $this;
    }
    
    public function check() {
        $results = [];
        $all_ok = true;
        
        // PHPバージョンチェック
        if (isset($this->requirements['php'])) {
            $req = $this->requirements['php'];
            $ok = version_compare($req['current'], $req['min'], '>=');
            
            if ($req['max']) {
                $ok = $ok && version_compare($req['current'], $req['max'], '<=');
            }
            
            $results[] = [
                'type' => 'PHP',
                'name' => 'PHP',
                'required' => $req['min'] . ($req['max'] ? " - {$req['max']}" : '+'),
                'current' => $req['current'],
                'status' => $ok ? 'OK' : 'NG'
            ];
            
            $all_ok = $all_ok && $ok;
        }
        
        // 拡張機能チェック
        foreach ($this->requirements as $key => $req) {
            if (strpos($key, 'ext_') !== 0) continue;
            
            $ok = $req['installed'];
            
            if ($ok && $req['min']) {
                $ok = version_compare($req['current'], $req['min'], '>=');
            }
            
            $results[] = [
                'type' => '拡張機能',
                'name' => $req['name'],
                'required' => $req['min'] ?: '(任意のバージョン)',
                'current' => $req['current'] ?: '未インストール',
                'status' => $ok ? 'OK' : 'NG'
            ];
            
            $all_ok = $all_ok && $ok;
        }
        
        return [
            'all_ok' => $all_ok,
            'results' => $results
        ];
    }
    
    public function displayResults() {
        $check = $this->check();
        
        echo "=== バージョン互換性チェック ===\n\n";
        echo sprintf("%-12s %-20s %-20s %-15s %s\n", 
            "種類", "名前", "必要", "現在", "状態");
        echo str_repeat("-", 80) . "\n";
        
        foreach ($check['results'] as $result) {
            $status_mark = $result['status'] === 'OK' ? '✓' : '✗';
            echo sprintf("%-12s %-20s %-20s %-15s %s %s\n",
                $result['type'],
                $result['name'],
                $result['required'],
                $result['current'],
                $status_mark,
                $result['status']
            );
        }
        
        echo "\n総合結果: " . ($check['all_ok'] ? '✓ すべてOK' : '✗ 要件を満たしていません') . "\n";
        
        return $check['all_ok'];
    }
}

// 使用例
$checker = new VersionChecker();
$checker
    ->requirePHP('8.0.0', '8.9.99')
    ->requireExtension('mysqli', '8.0.0')
    ->requireExtension('pdo')
    ->requireExtension('gd')
    ->requireExtension('curl')
    ->displayResults();
?>

例4: バージョン別の機能分岐

<?php
function getAvailableFeatures() {
    $version_id = PHP_VERSION_ID;
    
    $features = [
        'Named Arguments (8.0+)' => $version_id >= 80000,
        'Match Expression (8.0+)' => $version_id >= 80000,
        'Nullsafe Operator (8.0+)' => $version_id >= 80000,
        'Enums (8.1+)' => $version_id >= 80100,
        'Readonly Properties (8.1+)' => $version_id >= 80100,
        'Readonly Classes (8.2+)' => $version_id >= 80200,
        'Disjunctive Normal Form Types (8.2+)' => $version_id >= 80200,
    ];
    
    echo "=== PHP機能サポート状況 ===\n";
    echo "PHPバージョン: " . phpversion() . "\n\n";
    
    foreach ($features as $feature => $supported) {
        $status = $supported ? '✓ サポート' : '✗ 非サポート';
        echo sprintf("%-40s %s\n", $feature, $status);
    }
    
    return $features;
}

getAvailableFeatures();
?>

例5: セキュリティバージョンチェック

<?php
function checkSecurityStatus() {
    $version = phpversion();
    $version_id = PHP_VERSION_ID;
    
    // サポート終了バージョン
    $eol_versions = [
        '7.4' => ['date' => '2022-11-28', 'id' => 70400],
        '8.0' => ['date' => '2023-11-26', 'id' => 80000],
        '8.1' => ['date' => '2024-11-25', 'id' => 80100],
    ];
    
    echo "=== セキュリティステータス ===\n";
    echo "PHPバージョン: {$version}\n\n";
    
    $major_minor = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;
    $has_issue = false;
    
    // EOLチェック
    foreach ($eol_versions as $ver => $info) {
        if ($major_minor === $ver) {
            echo "⚠ 警告: このバージョンはサポート終了しています\n";
            echo "   EOL日: {$info['date']}\n";
            echo "   推奨: PHP 8.2以降へのアップグレード\n";
            $has_issue = true;
            break;
        }
    }
    
    // 最新版チェック
    if ($version_id < 80200) {
        echo "⚠ 情報: より新しいPHPバージョンが利用可能です\n";
        echo "   推奨バージョン: PHP 8.2以降\n";
    } elseif (!$has_issue) {
        echo "✓ このバージョンは現在サポートされています\n";
    }
}

checkSecurityStatus();
?>

バージョン比較のテクニック

version_compare関数との組み合わせ

<?php
function checkVersionCompatibility($required_version, $operator = '>=') {
    $current = phpversion();
    
    $compatible = version_compare($current, $required_version, $operator);
    
    echo "必要なバージョン: {$required_version} ({$operator})\n";
    echo "現在のバージョン: {$current}\n";
    echo "互換性: " . ($compatible ? '✓ OK' : '✗ NG') . "\n";
    
    return $compatible;
}

// 使用例
checkVersionCompatibility('8.0.0', '>=');
checkVersionCompatibility('8.9.99', '<=');
?>

PHP_VERSION_IDを使った高速比較

<?php
// PHP_VERSION_ID: メジャー*10000 + マイナー*100 + リリース
// 例: 8.2.10 = 80210

// 方法1: 文字列比較(遅い)
if (version_compare(phpversion(), '8.0.0', '>=')) {
    // 処理
}

// 方法2: 整数比較(速い)
if (PHP_VERSION_ID >= 80000) {
    // 処理
}

// ベンチマーク
$iterations = 100000;

$start = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
    $result = version_compare(phpversion(), '8.0.0', '>=');
}
$time1 = microtime(true) - $start;

$start = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
    $result = PHP_VERSION_ID >= 80000;
}
$time2 = microtime(true) - $start;

echo "=== パフォーマンス比較 ===\n";
echo "version_compare: " . number_format($time1, 6) . "秒\n";
echo "PHP_VERSION_ID:  " . number_format($time2, 6) . "秒\n";
echo "差分: " . number_format(($time1 / $time2), 2) . "x 速い\n";
?>

拡張機能の詳細チェック

特定の拡張機能の詳細確認

<?php
function checkExtensionDetails($extension) {
    echo "=== {$extension} 拡張機能の詳細 ===\n\n";
    
    // インストール確認
    $installed = extension_loaded($extension);
    echo "インストール: " . ($installed ? '✓ はい' : '✗ いいえ') . "\n";
    
    if (!$installed) {
        echo "\nこの拡張機能はインストールされていません\n";
        return;
    }
    
    // バージョン取得
    $version = phpversion($extension);
    echo "バージョン: " . ($version ?: '(不明)') . "\n";
    
    // 関数一覧
    $functions = get_extension_funcs($extension);
    if ($functions) {
        echo "\n提供される関数 (" . count($functions) . "個):\n";
        foreach (array_slice($functions, 0, 10) as $func) {
            echo "  - {$func}()\n";
        }
        if (count($functions) > 10) {
            echo "  ... 他 " . (count($functions) - 10) . "個\n";
        }
    }
}

// 使用例
checkExtensionDetails('mysqli');
?>

よく使う拡張機能のバージョンレポート

<?php
function generateExtensionReport() {
    $important_extensions = [
        'Core' => '必須',
        'mysqli' => 'データベース',
        'pdo' => 'データベース',
        'pdo_mysql' => 'データベース',
        'curl' => 'HTTP通信',
        'openssl' => 'セキュリティ',
        'mbstring' => 'マルチバイト',
        'gd' => '画像処理',
        'zip' => 'ファイル圧縮',
        'xml' => 'XML処理',
        'json' => 'JSON処理',
    ];
    
    echo "=== 重要な拡張機能レポート ===\n";
    echo "PHPバージョン: " . phpversion() . "\n\n";
    echo sprintf("%-20s %-20s %-15s %s\n", 
        "拡張機能", "カテゴリ", "バージョン", "状態");
    echo str_repeat("-", 75) . "\n";
    
    foreach ($important_extensions as $ext => $category) {
        $loaded = extension_loaded($ext);
        $version = $loaded ? (phpversion($ext) ?: 'N/A') : '-';
        $status = $loaded ? '✓' : '✗';
        
        echo sprintf("%-20s %-20s %-15s %s\n", 
            $ext, $category, $version, $status);
    }
}

generateExtensionReport();
?>

総合診断ツール

<?php
function comprehensiveDiagnostics() {
    echo "=== PHP総合診断 ===\n\n";
    echo date('Y-m-d H:i:s') . "\n\n";
    
    // 1. PHPバージョン情報
    echo "【1. PHPバージョン】\n";
    echo "  バージョン: " . phpversion() . "\n";
    echo "  Version ID: " . PHP_VERSION_ID . "\n";
    echo "  SAPI: " . PHP_SAPI . "\n";
    echo "  OS: " . PHP_OS . " (" . PHP_OS_FAMILY . ")\n";
    echo "  アーキテクチャ: " . (PHP_INT_SIZE * 8) . "bit\n\n";
    
    // 2. メモリ情報
    echo "【2. メモリ設定】\n";
    echo "  制限: " . ini_get('memory_limit') . "\n";
    echo "  現在の使用量: " . number_format(memory_get_usage(true) / 1024 / 1024, 2) . " MB\n";
    echo "  ピーク使用量: " . number_format(memory_get_peak_usage(true) / 1024 / 1024, 2) . " MB\n\n";
    
    // 3. 拡張機能
    $extensions = get_loaded_extensions();
    echo "【3. 拡張機能】\n";
    echo "  総数: " . count($extensions) . "個\n";
    echo "  一覧: " . implode(', ', array_slice($extensions, 0, 10)) . "...\n\n";
    
    // 4. 重要な設定
    echo "【4. 重要な設定】\n";
    $settings = ['display_errors', 'error_reporting', 'max_execution_time', 
                 'upload_max_filesize', 'post_max_size', 'date.timezone'];
    
    foreach ($settings as $setting) {
        echo "  {$setting}: " . ini_get($setting) . "\n";
    }
    
    echo "\n";
    
    // 5. 設定ファイル
    echo "【5. 設定ファイル】\n";
    $main_ini = php_ini_loaded_file();
    echo "  メイン: " . ($main_ini ?: 'なし') . "\n";
}

comprehensiveDiagnostics();
?>

まとめ

phpversionは、PHPのバージョン情報を取得するためのシンプルで重要な関数です。

主な特徴:

  • ✅ PHPのバージョンを文字列で返す
  • ✅ 拡張機能のバージョンも取得可能
  • version_compareと組み合わせて互換性チェック
  • ✅ PHP_VERSION定数も利用可能

関連する定数:

  • PHP_VERSION – バージョン文字列
  • PHP_VERSION_ID – バージョンID(整数、高速比較用)
  • PHP_MAJOR_VERSION – メジャーバージョン
  • PHP_MINOR_VERSION – マイナーバージョン
  • PHP_RELEASE_VERSION – リリースバージョン

ベストプラクティス:

  • 単純な取得ならPHP_VERSION定数を使用(高速)
  • バージョン比較はversion_comparePHP_VERSION_ID
  • 拡張機能はextension_loadedと組み合わせる
  • セキュリティ上、サポートされているバージョンを使用

活用シーン:

  • 環境確認・診断ツールの作成
  • バージョン互換性チェック
  • 条件付き機能の実装
  • セキュリティ監視

この関数を理解して、適切なバージョン管理とセキュリティ対策を行いましょう!

参考リンク


この記事が役に立ったら、ぜひシェアしてください!

タイトルとURLをコピーしました