Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/04/2008, 17h57   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 38
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 38
Points : 10
Points : 10
Par défaut [POO] Ecraser une méthode d'une classe

Bonjour,

J'ai une class avec des fonctions que je veux modifier mais sans toucher à la class, comment puis-je faire ?

J'ai penssé à un creer une nouvelle class avec dedans la donction que je veux ecraser mais ca fonctionne pas :

fichier test3.php qui appel :

Code :
1
2
3
4
5
6
7
 
include('test.php');
include('test2.php');
 
$test = new test;
 
echo $test->test();
fichier test.php ma class principal

Code :
1
2
3
4
5
6
7
8
class test{
 
function test()	{
 
return 'hello';
}
 
}
fichier test2.php, ma class de remplacement

Code :
1
2
3
4
5
6
7
8
class test2 extends test{
 
function test()	{
 
return 'hello2';
}
 
}

COmment puis je avoir 'hello2' sans changer class test, inclure les deux class et en gardant le même non d'objet ?? En faite je voudrais ecraser la fonction test dans la class test !
fwdavy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 18h18   #2
Membre habitué
 
Étudiant
Inscription : janvier 2008
Messages : 144
Détails du profil
Informations personnelles :
Âge : 23

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 144
Points : 114
Points : 114
tu crée une autre classe mais qui est abstraite. Tes deux autres classes tu les étendra avec celle là.
Code :
1
2
3
4
5
6
 
abstract class laClasseAbstraite {
 
   protected abstract function test();
 
}
Tu étend chacune des classes avec la classe abstraite et tu es obligé de surcharger la fonction test.
Code :
1
2
3
4
5
6
7
8
9
10
11
 
public class test extends laClasseAbstraite {
   protected function test {
      return "Hello";
   }
}
public class test2 extends laClasseAbstraite {
   protected function test {
      return "Hello2";
   }
}
Par contre tu ne pourra pas avoir le même nom d'objet tu sera obligé de faire :
Code :
1
2
3
4
5
6
 
$test = new test();
echo $test->test();
 
$test2 = new test2();
echo $test2->test();
L'abstraction de classe te permet de redefinir les fonctions abstraites dans chaque classe que tu aura étendu. Donc tu pourra avoir 100 même 1000 classe test tu pourra la redéfinir autant de fois.

Je pense que sa se rapproche de se que tu veux
juninho269 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 18h31   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 38
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 38
Points : 10
Points : 10
Si j'utilise une class abstraite je dois toucher à ma class ce qui n'est pas possible...je voulais aussi ne pas toucher a la déclaration de mon objet mais c'est peut etre pas possible, je me contenterai donc de :

Code :
1
2
$test = new test2;
echo $test->test();
Merci
fwdavy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2008, 16h54   #4
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
Quel est le status de la fonction a surcharger ("ecraser") ?
Soit public, protected ou private. On ne peut pas surcharger des methodes ("fonction") privates.

A part l'extension, il existe une autre solution, le patron de conception ("design pattern") decorateur. L'idee est d'agreger la classe a decorer et de deleguer les appels a toutes les methodes qui ne sont pas a surcharger.

Exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
<?php
class decorator
{
  protected $parent = null;
  public function __construct( NomDeClassADecorer $parent )
  {
    $this->parent = $parent;
  }
  public function __call( $method, $arguments )
  {
    switch( $method )
    {
      case 'test':
        return call_user_func_array( array( $this, $method ), $arguments );
      default:
        return call_user_func_array( array( $this->parent, $method ), $arguments );
    }
  }
}
?>
http://smeric.developpez.com/java/uml/decorateur/

Dans les deux cas, on ne peut toujours pas surcharger de classes privates.
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2008, 17h11   #5
Membre habitué
 
Étudiant
Inscription : janvier 2008
Messages : 144
Détails du profil
Informations personnelles :
Âge : 23

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 144
Points : 114
Points : 114
Je suis un peu à la ramasse. Est ce que tu veut parler du pattern "Factory". Parce que c'est plus au niveau des constructeurs que c'est utile. Enfin bon je pense avoir mal compris. Pourrais tu préciser sa m'interesse.
juninho269 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2008, 18h15   #6
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
Je confirme que je parle du patron de conception decorator pour juninho269.
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h48.


 
 
 
 
Partenaires

Hébergement Web