開発環境
Ethna
PHP 5.4
Docker(イメージ:php:8.0-rc-apache)
発生したエラーと修正ポイント
PHP7までは非推奨だったものの、PHP8で廃止になった関数に対する対処がメインとなります。
\$array{\$i}
=& new
function クラス名(){} // コンストラクタ
count(null)
preg_replace(\$search."e", \$replace, \$subject)
mysql*
mcrypt*
Array and string offset access syntax with curly braces is no longer supported
波括弧で文字列・配列にアクセス不可。
PHP 8.0.0 より前のバージョンでは、 配列の要素にアクセスするときに、 角括弧と波括弧がどちらも同じ意味で使えていました。 (つまり、この例で \$array[42] と \$array{42} は同じものを表しているということです)。 波括弧で配列にアクセスする文法は、 PHP 7.4.0 以降は非推奨になり、 PHP 8.0.0 以降はサポートされなくなっています。
(引用元:https://www.php.net/manual/ja/language.types.array.php)
修正:\$string{\$i} を \$string[\$i] に置換。
syntax error, unexpected token "new"
新しいオブジェクトを参照渡しで代入不可。
(参考:https://www.php.net/manual/ja/migration70.incompatible.php)
修正:「= *& *new」で「= new」にgrep置換
is not compatible with method
互換性のないオーバーライドした関数
修正:引数、デフォルト値、型宣言を合わせる。
Call to a member function getPlugin() on null
コンストラクタで初期化されるはずの変数がnullになっていた模様。
PHP 8.0.0 より前のバージョンでは、グローバル名前空間にあるクラスは、 クラス名と同じ名前のメソッドが古いスタイルのコンストラクタとして解釈されます。
(引用元:https://www.php.net/manual/ja/language.oop5.decon.php)
修正(各クラス):function Ethna_Controller() ⇒ function __construct()
Non-static method Ethna_Controller::main() cannot be called statically in
static でないメソッドを静的にコールすると、Error がスローされます。
PHP 8.0.0 より前のバージョンでは、 static でないメソッドを静的にコールすることが非推奨になっており、 E_DEPRECATED レベルの警告が発生していました。
(引用元:https://www.php.net/manual/ja/language.oop5.static.php)
修正:\$thisを使用していないものはstatic。getInstanceもstatic。\$thisを使用している場合は呼出をnewする。
Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable|array, string given in
8.0.0 value パラメータに不正な型を渡した場合に、 TypeError をスローするようになりました。
7.2.0 value パラメータに不正な型を渡した場合に、 警告を発生させるようになりました。
https://www.php.net/manual/ja/function.count.php
修正:処理に応じて、countに渡す変数の型チェック、nullチェック、もしくはstring等⇒arrayにする。
preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
修正:e修飾子を削除し、preg_replace_callback に変更。および、create_functionを通常のfunction(){}形式に修正。
mysql*系の関数が無くなったのでmysqli*に対応
参考:https://tohokuaiki.hateblo.jp/entry/2017/09/20/%E4%BB%8A%E6%9B%B4%E3%81%A0%E3%81%91%E3%81%A9%E3%80%81Ethna%E3%82%92mysqli%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%9F%E6%99%82%E3%81%AE%E3%83%A1%E3%83%A2
DB/Ethna_DB_PEAR.php
<?php
function getInsertId()
{
if ($this->isValid() == false) {
return null;
} else if ($this->type == 'mysql') {
return mysql_insert_id($this->db->connection);
} else if ($this->type == 'mysqli') { # 追加
return mysqli_insert_id($this->db->connection); # 追加
} else if ($this->type == 'sqlite') {
/* mysqli_connectはresourceではなく、Objectなので */
function isValid()
{
if (is_null($this->db)
|| (is_object($this->db->connection) == false && # 追加
is_resource($this->db->connection) == false)) {
function quoteIdentifier($identifier)
{
/** 中略 **/
switch ($this->type) {
case 'mysql':
case 'mysqli': # 追加
$ret = '`' . $identifier . '`';
break;
function &getMetaData($table)
{
/** 中略 **/
switch ($this->type) {
case 'mysql':
case 'mysqli': # 追加
その他
mcrypt_encryptは PHP 7.1.0 で 非推奨となり、PHP 7.2.0 で削除 されました。この関数に頼らないことを強く推奨します。
(引用元:https://www.php.net/manual/ja/function.mcrypt-encrypt.php)
未対応
↧