PHP-GTK 是 PHP 4/5 時代的 GTK+ 綁定擴展,允許用 PHP 編寫跨平台桌面 GUI 程序。雖然已停止維護(最後更新 2008 年),但理解其架構有助於掌握 PHP 非 Web 領域的探索歷史。現代替代方案請見 文末建議。
php_gtk.dll 放入 PHP extensions 目錄。C:\Windows\System32。php.ini 添加 extension=php_gtk.dll。dl('php_gtk.dll')。<?php
set_time_limit(0);
if (!class_exists('gtk')) {
dl(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? 'php_gtk.dll' : 'php_gtk.so');
}
$window = new GtkWindow();
$window->set_title('PHP-GTK 記事本');
$window->set_usize(600, 450);
$window->connect_object('destroy', ['gtk', 'main_quit']);
// 菜單欄
$vbox = new GtkVBox();
$menuBar = new GtkMenuBar();
$fileMenu = new GtkMenu();
$fileItem = new GtkMenuItem('文件');
$fileItem->set_submenu($fileMenu);
$openItem = new GtkMenuItem('打開');
$openItem->connect('activate', 'showFileDialog');
$saveItem = new GtkMenuItem('保存');
$saveItem->connect('activate', 'saveFile');
$exitItem = new GtkMenuItem('退出');
$exitItem->connect('activate', ['gtk', 'main_quit']);
$fileMenu->append($openItem);
$fileMenu->append($saveItem);
$fileMenu->append(new GtkSeparatorMenuItem());
$fileMenu->append($exitItem);
$menuBar->append($fileItem);
$vbox->pack_start($menuBar, false, false);
// 文本編輯區
$scrolled = new GtkScrolledWindow();
$scrolled->set_policy(GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
$text = new GtkText();
$text->set_editable(true);
$text->set_word_wrap(true);
$scrolled->add($text);
$vbox->pack_start($scrolled, true, true);
$window->add($vbox);
$window->show_all();
gtk::main();
// 回調函數
$filePath = null;
function showFileDialog() {
global $filePath;
$dialog = new GtkFileSelection('選擇文件');
$dialog->ok_button->connect('clicked', function($btn) use ($dialog) {
$filePath = $dialog->get_filename();
$dialog->destroy();
openFile($filePath);
});
$dialog->cancel_button->connect('clicked', [$dialog, 'destroy']);
$dialog->show();
}
function openFile($path) {
global $text;
if (is_file($path)) {
$content = file_get_contents($path);
$text->set_text($content);
}
}
function saveFile() {
global $filePath, $text;
if ($filePath && is_file($filePath)) {
file_put_contents($filePath, $text->get_text());
}
}
?>
php4ts.dll 及 GTK DLL 到 EXE 同目錄。缺點:啟動時彈出控制台窗口、依賴大量 DLL、不支持現代 PHP 特性、無法加載額外擴展(需源碼級修改)。
| 方案 | 特點 | 學習曲線 |
|---|---|---|
| PHP + WebView2 / Tauri | 前端 HTML/JS/Vue/React,後端 PHP 內置服務器 (Swoole/RoadRunner) 或 CLI RPC | 低(Web 技術棧) |
| Electron + PHP (子進程) | 成熟生態,PHP 做後端 API | 中 |
| PeachPie (PHP on .NET) | 直接用 WPF/WinForms/MAUI 做 UI,PHP 邏輯編譯為 .NET 程序集 | 中高(需 .NET 基礎) |
| Python (PyQt/PySide/Tkinter) | 原生 GUI 生態最豐富,語法與 PHP 相近 | 低 |
結語:PHP-GTK 完成了歷史使命,新項目請擁抱 Web 技術棧或現代跨平台框架。