phpPgAdminをPHP7で使うとDeprecatedエラーが出るので対応
phpPgAdmin便利ですよね。Web上でデータベースの管理が出来るため、PostgreSQLをベースにWebシステムやHPを運営している方々には必須なWebツールだと思います。
…がしかし。
phpPgAdminは2018年11月12日で開発が止まっている
phpPgAdminの公式ページを見るとわかりますが、最新バージョンは5.6で、更新日は2018年11月12日。 http://phppgadmin.sourceforge.net/
この記事を書いているのは2020年の5月ですが、すでに1年半は更新されていません。
一般的(?)な感覚だとわずか1年半、とも言えるかも知れませんが、オープンソースの世界、特にPHPのバージョンアップペースは異様に早いので不安がよぎります。
ぼくが運営しているHPやWebシステムの大半はPHP7.3やMySQLへ移行していますが、極一部、PostgreSQLを使っているものがあり、テスト環境を作り直した際にこの問題に直面しました。
そう、
phpPgAdmin 5.6はPHP7の環境で動作しない
より具体的にはDeprecatedエラーが大量に出ます。
↓こんなやつ。
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP;
Deprecatedエラーは「将来的に使えなくなる機能だから非推奨だよ」という警告レベルなので、php.iniのerror_reportingで抑制することができます。…本来は。
php.iniでDeprecatedエラーを抑制する例
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
でも、うちにあるPHP7.2やPHP7.3の環境では ~E_DEPRECATED を付けても一部のDeprecatedエラーが消えません。
仕方がないのでphpPgAdminのソースを見て修正することにしました。
phpPgAdmin 5.6でDeprecatedエラーが出るのはコンストラクタの問題
例えば、/phppgadmin/classes/Misc.php の中にこんな記述があります。
/* Constructor */
function Misc() {
}
クラス名と同名の関数を定義することでコンストラクタにしているわけですね。
なので、これをPHP7でも動作するように書き換えるには↓こうするだけです。
/* Constructor */
function __construct() {
}
こうした単純な修正作業が全部で6ファイル分ありました。
/phppgadmin/classes/Misc.php /phppgadmin/classes/database/ADODB_base.php /phppgadmin/classes/database/Connection.php /phppgadmin/libraries/decorator.inc.php /phppgadmin/libraries/adodb/adodb.inc.php /phppgadmin/libraries/adodb/drivers/adodb-postgres64.inc
親クラスのコンストラクタを呼び出している部分がある
少し悩んだのが、/phppgadmin/classes/database/ 以下にあるPostgreと名の付くファイル群。
どうやら、Postgres.phpを親クラスとして持ち、各バージョンごとにPostgres10~96まで計15個。
/phppgadmin/classes/database/Postgres.php /phppgadmin/classes/database/Postgres10.php /phppgadmin/classes/database/Postgres11.php /phppgadmin/classes/database/Postgres74.php /phppgadmin/classes/database/Postgres80.php /phppgadmin/classes/database/Postgres81.php /phppgadmin/classes/database/Postgres82.php /phppgadmin/classes/database/Postgres83.php /phppgadmin/classes/database/Postgres84.php /phppgadmin/classes/database/Postgres90.php /phppgadmin/classes/database/Postgres91.php /phppgadmin/classes/database/Postgres92.php /phppgadmin/classes/database/Postgres93.php /phppgadmin/classes/database/Postgres94.php /phppgadmin/classes/database/Postgres95.php /phppgadmin/classes/database/Postgres96.php
親クラスが定義してあるPostgres.phpは先述の修正と同じく、function Postgres() を function __construct() へ書き換えれば良いだけです。
しかし、それだけだと各バージョン用のPostgres10~96が親クラスのコンストラクタ function Postgres() を呼び出しているので、「関数がないよ!」と怒られてしまいます。
具体例を出すと Postgres74.php の中はこんな感じ。
class Postgres74 extends Postgres80 {
function Postgres74($conn) {
$this->Postgres($conn);
}
}
function Postgres74($conn) の部分を function __construct($conn) へと書き換えるのは良いのですが、 $this->Postgres($conn); も書き換えなければいけません。既にPostgresクラスにはPostgres関数はないので。
ちょっとこのあたりもっとうまいやり方があるのかも知れませんが、コードを熟読するのが面倒すぎたので、下記のように書き換えました。
class Postgres74 extends Postgres80 {
function __construct($conn) {
parent::__construct($conn);
}
}
parent::__construct($conn); で親のコンストラクタを呼び出すわけですね。
どうもPostgresクラスから96→94→93→92→91みたいな感じで継承してそうなので、非常に無駄がある気がしなくもなくもないのですが…………まぁ動いたからいっか!! という感じですw
phpPgAdminのメンテナンスが止まっている以上、あまり長く使うとも思えませんし。今後はDBもMySQL(MariaDB)やSQLiteで済ませてしまおうかなと思ってもいるので、少々雑な対応で済ませました。
まとめ
phpPgAdminをPHP7で動かそうとしたらDeprecatedエラーが出たので、下記ソースを書き換えて対応しましたよ、というお話でした。
/phppgadmin/classes/Misc.php /phppgadmin/classes/database/ADODB_base.php /phppgadmin/classes/database/Connection.php /phppgadmin/libraries/decorator.inc.php /phppgadmin/libraries/adodb/adodb.inc.php /phppgadmin/libraries/adodb/drivers/adodb-postgres64.inc /phppgadmin/classes/database/Postgres.php /phppgadmin/classes/database/Postgres10.php /phppgadmin/classes/database/Postgres11.php /phppgadmin/classes/database/Postgres74.php /phppgadmin/classes/database/Postgres80.php /phppgadmin/classes/database/Postgres81.php /phppgadmin/classes/database/Postgres82.php /phppgadmin/classes/database/Postgres83.php /phppgadmin/classes/database/Postgres84.php /phppgadmin/classes/database/Postgres90.php /phppgadmin/classes/database/Postgres91.php /phppgadmin/classes/database/Postgres92.php /phppgadmin/classes/database/Postgres93.php /phppgadmin/classes/database/Postgres94.php /phppgadmin/classes/database/Postgres95.php /phppgadmin/classes/database/Postgres96.php
書き換えるのが面倒な方向けに、修正済ソースを置いておきますので、良ければどうぞ。