2017-10-08 19 views
2

私は何かの前に自動ロードするErrorというカスタムクラスを持っています。私のカスタムクラスでは、私はコンストラクタとシングルトンを持っている。このような関数を取得:私のマスターでPHP7:クラスがインスタンス化されるまで、静的クラス関数は呼び出されず/見えません。

class Error 
{ 
    // Singleton object. Leave $me alone. 
    private static $me; 

    public $errors; // Array of errors 
    public $style; // CSS rules to apply to error elements 

    private function __construct($style = "border:1px solid red;") 
    { 
     $this->errors = array(); 
     $this->style = $style;   
    } 

    // Get Singleton object 
    public static function getError() 
    { 
     if(is_null(self::$me)) 
      self::$me = new Error(); 

     return self::$me; 
    } 
    //... 
} 

が含まれ、私は常にコア・ロジックの前に、このカスタムクラスのシングルトンを用意しました:

$Error = Error::getError(); 

はしかし、PHP 7で、これは今、私にエラーを与えている:

Fatal error: Uncaught Error: Call to undefined method Error::getError()

あなたは、これはもう動作しない理由を私は理解するのに役立つことはできますか?私は、エラー・クラスは、すべての時にロードされているかどうかをチェックする代わりにこれを試してみた、そしてそれが仕事(とコンストラクタを呼び出す)ん:私はしていない限り

$Error = new Error(); 

どういうわけか、私はクラスの静的関数を呼び出すことはできませんこのクラスをインスタンス化しました。これは本当にphp7の変更であれば、これは私が持っている他の多くのロジックを破ります。

+2

PHP7には、組み込みの 'Error'クラスがあります。おそらく名前空間エラーが発生しています。あなたの 'Error'クラスはカスタム名前空間に存在しますか? http://php.net/manual/en/class.error.php –

+0

あなたが永久にPHP 7にアップグレードする立場にある場合(あなたのコードは5.xで動作する必要がなくなりました)、おそらく内部的なあなた自身の代わりに 'Error'クラス。 –

+0

@MichaelBerkowskiありがとう、それは最も有望な原因、どのような不幸な衝突と思われる。幸運にも、過去の作業は簡単です。私のErrorクラスの静的な初期化関数を呼び出す場所は1つだけなので、これは簡単です。これが原因であるかどうかを確認します。答えとして「組み込みの」名前空間コメントを自由に追加してください。これで問題を解決しようとすれば、それをマークします。 – Tiago

答えて

1

PHP 7以降、PHPには、アプリケーションのErrorクラスと矛盾するように見えるErrorビルトインクラスが組み込まれています。

PHP pre-defined Error class

独自のアプリケーションのクラスがカスタム名前空間内で定義されていない、あなたはError::getError()を呼び出そうとしている場合は、PHPはあなたが意味するものとします内蔵のいかなる規定されgetError()方法を持っていないクラス。 (それは同様の非静的メソッドを持っています)。

あなたはアプリケーションにadding a custom namespaceによってこれを回避することができますが、これはお勧めの方法です。また、PHP 5.xでアプリケーションを継続して実行する必要がない場合は、組み込みのErrorクラス機能を使用するようリファクタリングすることを検討してください。

関連する問題