web-dev-qa-db-ja.com

PHPで関数を非推奨にする方法は?

私が協力しているチームには、データベースと通信するためにコード全体でPHPのibase_ *関数を使用する古いコードベースがあります。元の関数を呼び出す以外に何かを行うラッパーを作成し、コード全体で一括検索-置換を行って、ラッパーが代わりに使用されるようにしました。

では、将来ibase_ *関数の使用を防ぐにはどうすればよいでしょうか。

できれば、引き続き利用できるようにしたいのですが、使用時に通知または警告をスローするようにします。

純粋なPHP(PHPのカスタムバージョンをコンパイルする必要はありません)のソリューションが推奨されます。

30
Milan Babuškov

trigger_error()

function my_deprecated_function() {
    trigger_error("Deprecated function called.", E_USER_NOTICE);
    // do stuff.
}
43
nickf

一般的に言って、メソッドに非推奨のフラグを立てて、将来のバージョンで機能しないコードについてユーザーに警告を与えることができます。 trigger_error をいくつかの phpdoc と一緒に使用するのが最善の方法だと思います。

/**
 * @deprecated
 *
 * @return $this
 */
public function oldMethod()
{
    trigger_error('Method ' . __METHOD__ . ' is deprecated', E_USER_DEPRECATED);

    return $this;
}

@deprecated phpdocは重要です。 PHPStorm のような多くのIDEはそれを認識し、使用しようとするとメソッド名を打つため、実際にコードを実行する前に非推奨になっていることに気付きます。

それは多かれ少なかれ次のようになります:

jetbrains deprecated strikethrough

Phpdocのほかに、実行時に適切なエラーをトリガーすることで、ユーザーが警告を受け取るようにすることができます。正しい定数を使用していることを確認してください(つまり、E_USER_DEPRECATED)。

E_DEPRECATEDは代わりにPHPによって内部的に使用されるため、notは使用しないでください。詳細情報 ここ

21

私は自分でチェックしていませんが、ブックマークでこれを見つけました: http://wiki.php.net/rfc/e-user-deprecated-warning

編集:わかりました、これはまだ機能していません-したがって、E_USER_DEPRECATEDの代わりにE_USER_NOTICEのようなものを使用してください:

<?php
class Foo
{   
    public function __construct()
    {
        trigger_error('Use Bar instead', E_USER_NOTICE);
    }
}

$foo = new Foo()

これはこれで終わります:

Notice: Use Bar instead in /home/unexist/projects/ingame/svn/foo.php on line 6
6
unexist

関数がクラスの一部である場合は、コンストラクターで trigger_error を使用して、非推奨を警告できます。

または、関数が1つのファイルにある場合、ファイルの先頭で非推奨の警告をトリガーすると、ファイルが他の場所に含まれている場合は常にエラーが表示されます。

最後に、非推奨の関数のいずれかの最初の行にエラーをスローする可能性があります。

2
Codebeef

使用時に実行時の警告を出す代わりに、この関数の使用についてコードベースをスキャンし、問題のあるコードのレポートを生成できるスクリプトを作成することを検討できます。たまに、それを実行します。

バージョン管理システムを使用している場合は、スクリプトをコミットフックとして設定できます。非推奨の関数を含むスクリプトがチェックインされたときに、単に電子メールを送信するポストフックをお勧めしますが、本当にそれを強制したい場合は、プリフックで誰もチェックインできないようにすることができます。

2
troelskn