web-dev-qa-db-ja.com

「非静的メソッドxxx:xxx()をPHP 5.4で静的に呼び出さないでください。

現在、PHPで大規模なプラットフォームを使用しています。

ホストされているサーバーは最近PHP 5.4。

以来、私は次のような多くのエラーメッセージを受け取りました:

[2012年5月26日19:04:41 2012] [エラー] PHP厳格な標準:非静的メソッドConfig :: getData()は、$ thisの互換性のないコンテキストから静的に呼び出されるべきではありません35行目の/xxx/Config.inc.php

メソッドの例は次のように定義されています( 'static'キーワードがないことに注意してください):

function &getData() {
            $configData =& Registry::get('configData', true, null);

    if ($configData === null) {
        // Load configuration data only once per request, implicitly
        // sets config data by ref in the registry.
        $configData = Config::reloadData();
    }

    return $configData;
}

これは以前に問題を引き起こしたことはなく、エラーメッセージ(アプリケーションをクラッシュさせる)は、PHP5.4への最近のアップグレードに関連している可能性があります。

PHP設定はありますが、静的キーワードの欠如を「無視」するように変更できますか?

30
kaese

error_reporting()からE_STRICTを削除するか、メソッドを静的に呼び出す必要がある場合は、メソッドを静的にすることができます。私の知る限り、静的メソッドと非静的メソッドの両方として呼び出すことができるメソッドを(厳密に)作成する方法はありません。また、面倒なことに、同じ名前のメソッドを2つ持つことはできません。1つは静的メソッドで、もう1つは非静的メソッドです。

42
lanzz

警告メッセージを無効にすることは、問題を解決する方法ではありません。 PHPコアは引き続き動作しますが、危険な仮定とアクションを行います。

PHPは何かを仮定すべき!!!!

クラスの場合シングルトンとして構成されている場合は、常に関数getInstance()を使用してからgetData()を使用できます

リクセ:

$classObj = MyClass::getInstance();
$classObj->getData();

クラスがシングルトンでない場合は、使用します

 $classObj = new MyClass();
 $classObj->getData();
29
volkinc

プロジェクトのstrictsエラーを単に隠すことはお勧めしません。代わりに、メソッドを静的に変更するか、オブジェクトの新しいインスタンスを作成してください:

$var = new YourClass();
$var->method();

また、PHP 5.4:

(new YourClass)->method();

お役に立てばと思います!

10
Bruno Campos