2017-10-08 12 views
2

J'ai une classe personnalisée appelée Error que je charge automatiquement avant toute autre chose. Dans ma classe personnalisée, j'ai un constructeur et un singleton fonction Obtenir comme ceci:PHP7: La fonction de classe statique ne peut pas être appelée/vue jusqu'à ce que la classe soit instanciée

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; 
    } 
    //... 
} 

Dans mon maître comprennent, je me suis toujours préparé un singleton de cette classe personnalisée avant la logique de base:

$Error = Error::getError(); 

Cependant, en PHP 7 ce me donne maintenant une erreur:

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

Pouvez-vous me aider à comprendre pourquoi cela ne fonctionne plus? J'ai essayé cela au lieu de vérifier si la classe d'erreur est en cours de chargement du tout, et il ne fonctionne (et appelle le constructeur):

$Error = new Error(); 

D'une certaine façon je ne peux pas appeler la fonction de classe statique à moins que j'ai instancié cette classe. Cela va casser beaucoup d'autres logique que j'ai si c'est vraiment un changement dans php7.

+2

PHP7 possède une classe 'Error' intégrée. Vous rencontrez probablement des erreurs d'espace de noms. Votre classe 'Error' existe-t-elle dans un espace de noms personnalisé? http://php.net/manual/fr/class.error.php –

+0

Si vous êtes en mesure de passer en permanence à PHP 7 (votre code n'a plus besoin de fonctionner sous 5.x), vous pourriez peut-être simplement adopter le code interne. Classe 'Error' à la place de la vôtre. –

+0

@MichaelBerkowski merci, cela semble la cause la plus probable, quel affrontement malheureux. Heureusement, c'est facile pour moi de travailler passé, car un seul endroit appelle la fonction d'initialisation statique pour ma classe Error. Je vais vérifier si c'est la cause. N'hésitez pas à ajouter le commentaire "built-in" de l'espace de noms en guise de réponse. Je vais le marquer si cela me permet de résoudre le problème. – Tiago

Répondre

1

Depuis PHP 7, PHP inclut une classe Error intégrée qui semble entrer en conflit avec la classe Error de votre application.

PHP pre-defined Error class

Si votre propre classe d'application n'est pas définie dans un espace de noms personnalisé et que vous tentez d'appeler Error::getError(), PHP vous assumez dire la classe intégrée qui n'a pas de méthode définie getError(). (Il a une méthode similaire à getMessage()).

Vous pouvez contourner cela par adding a custom namespace à votre application, ce qui est une pratique recommandée de toute façon. Ou si votre application n'a pas besoin de continuer sous PHP 5.x, envisagez de la refactoriser pour utiliser la fonctionnalité de classe Error intégrée à la place.