2012-02-28 3 views
0

J'ai deux classes commefonction PHP problème de compatibilité

class A{ 
public function Get($a='0',$b=''){ 
    retrun 0; 
} 
} 

class B extends A{ 
public function Get($a){ 
    return 0; 
} 
} 

Il travaillait dans la machine locale avec PHP 5.2.5 quand je l'application migré sur le serveur en temps réel avec PHP 5.3.4, il donne l'erreur suivante:

Declaration of B::Get() should be compatible with that of A::get() 

Que dois-je faire? Je ne peux pas changer la version de PHP du serveur distant.

+0

Je ne pense pas que ce soit une erreur, c'est juste un avis. la solution la plus simple consiste à ajouter le paramètre seond à la fonction, par exemple. 'function get ($ a, $ b = NULL)' donc vous n'avez pas besoin de donner le second param, mais la déclaration est la même pour les deux. – Rufinus

+0

Mais j'ai des millions de fonctions – Kutta

+0

juste une supposition, mais utilisez-vous des interfaces? nevermind - pouvez-vous vérifier si c'est une erreur ou un avis? Si c'est le cas, vous pouvez désactiver ce type d'avis dans php.ini ou (.htaccess ou ini_set()). Rechercher E_STRICT (afaik) – Rufinus

Répondre

2

Les déclarations de fonction de Get() doivent correspondre pour les classes A et B, c'est-à-dire qu'elles doivent avoir le même nombre de paramètres. De votre exemple ci-dessus, il apparaît que A :: Get() prend 2 paramètres et B :: Get() n'en prend qu'un. Ils ont tous deux besoin de prendre 2.

+0

Mais j'ai des millions de telles fonctions dans mon application – Kutta

+0

Ce n'est pas recommandé , mais vous pouvez supprimer les erreurs en désactivant les erreurs E_STRICT. – mmcnickle

1

Fondamentalement, la racine de votre problème est cassé API.

Si vous avez deux classes qui ont deux méthodes complètement différentes, alors on ne peut pas être une sous-classe de l'autre. C'est juste faux.

Mais supposons qu'il n'y a rien que vous puissiez faire à ce sujet. Dans ce cas, la meilleure façon de corriger serait de modifier la déclaration de B :: get():

class B extends A 
{ 
    public function get($a , $b = null) 
    { 
     return $this->do_something_with($a); 
    } 
} 

De cette façon, vous pouvez ignorer complètement le second paramètre et il ne sera pas nécessaire. Il s'agit d'une mauvaise idée. Mais gardez à l'esprit que toute la situation est causée par la violation de Liskov substitution principle

L'image devrait aider à comprendre:

enter image description here

0
class A{ 
public function Get($a='0',$b=''){ 
    retrun 0; 
} 
} 

class B extends A{ 
public function Get($a){ 
    return parent::Get($a,null); 
} 
} 

il travaille avec php 5.3.5.