Général Polymorphisme avec PHP exemples
Que seuls les Chiens peuvent jouer "fetch", est-ce un exemple d'une bonne ou une mauvaise idée? Je soupçonne que c'est une très mauvaise idée à cause de l'utilisation de instanceof, mais je ne suis pas entièrement sûr de savoir pourquoi.
class Animal {
var $name;
function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
function speak() {
return "Woof, woof!";
}
function playFetch() {
return 'getting the stick';
}
}
class Cat extends Animal {
function speak() {
return "Meow...";
}
}
$animals = array(new Dog('Skip'), new Cat('Snowball'));
foreach($animals as $animal) {
print $animal->name . " says: " . $animal->speak() . '<br>';
if ($animal instanceof Dog) echo $animal->playFetch();
}
Un autre exemple. Comme je suis constamment à la création d'objets de données qui ont un ID, j'ai pensé que je pourrais aussi bien s'étendre à partir d'une classe de base pour éviter la duplication de code. Encore une fois, c'était mauvais? En tant que Président de ne pas avoir un nom et un Chien n'a pas de roues. Mais ils sont à la fois des Objets de Données de sorte qu'il est très déroutant.
class Data_Object {
protected $_id;
function setId($id) {
$this->_id = $id;
}
function getId() {
return $this->_id;
}
}
class Dog extends Data_Object {
protected $_name;
function setName($name) {
$this->_name =
}
function getName() {
return $this->_name;
}
}
class Chair extends Data_Object {
protected $_numberOfWheels;
function setNumberOfWheels($number) {
$this->_numberOfWheels = $number;
}
function getNumberOfWheels() {
return $this->_numberOfWheels;
}
}
Essentiellement ce que je pense je pose la question est: "doit toutes les classes ont la même interface ou peuvent-ils avoir différents?"
- Assez sûr que cela a été demandé ici avant, mais la réponse courte est que c'est OK pour les sous-classes pour avoir une interface différente.
- Je suis sûr que le premier exemple n'est pas droit en raison de l'utilisation de instanceof pour la logique conditionnelle. N'est pas du tout le point de Polymorphisme de ne pas le faire?
- Pourquoi voudriez-vous d'obtenir tous les animaux de faire quelque chose (parler), à l'exception d'un type (Chien)? Sonne comme défectueux, la logique est dans la boucle, pas les définitions de classe.
- Ils parlent tous, y compris le chien. Mais seulement le chien peut jouer à rapporter. De toute façon, je pense que je pourrais avoir trouvé quelque chose d'utile ici: stackoverflow.com/questions/6119087/...
- Si deux objets différents pour faire la même chose de différentes façons, c'est le polymorphisme. Si un objet peut en outre faire autre chose, eh bien, ainsi soit-il. Ce n'est pas un comportement polymorphique alors, puisque c'est un comportement unique pour l'objet. Vous ne serait pas juste de traiter ce comportement spécifique, comme polymorphe ensuite.
- qui a le sens parfait, merci. Cela s'applique parfaitement à mon deuxième exemple. Je pense que mon premier est toujours très erronée comme je viens de lire cette citation de Scott Meyers: "Quand vous vous trouvez à l'écriture de code de la forme "si l'objet est de type T1, puis faire quelque chose, mais si elle est de type T2, puis faire quelque chose d'autre," la claque de vous-même."
Data_Object
sonne comme un mauvais nom de classe. ProbablementModelAbstract
est plus appropriée.- Je pense que si vous avez un chèque de instanceof pour jouer à rapporter, il devrait être remplacé par
$animal->canPlayFetch()
- FTR, le titre est trompeur. deceze réponse dans les commentaires répondu à la question générale sur le polymorphisme, où la question et a accepté de répondre ont été orientés vers un exemple précis.
- Ce site web ont une très bonne explication et des exemples de pratiques phpenthusiast.com/object-oriented-php-tutorials/... // phpenthusiast.com/object-oriented-php-tutorials/...
Vous devez vous connecter pour publier un commentaire.
Dans ce contexte, il est utile de parler de interfaces.
Tout animal ou de l'homme (ou étranger) qui implémente le Bavard interface peut être utilisée dans un contexte où bavard êtres sont nécessaires:
C'est correctement utilisé polymorphe de la méthode. Vous n'avez pas de soins ce vous traitez avec tant qu'il peut,
speak()
.Si
Dog
s peut aussi jouer à rapporter, c'est super pour eux. Si vous voulez généraliser que, penser en termes d'une interface. Peut-être qu'un jour vous aurez un hautement qualifiés chat qui peut jouer à rapporter ainsi.Le point important ici est que quand vous appel
playFetch()
sur quelque chose, c'est parce que vous voulez jouer chercher avec cet animal. Vous n'appelez pasplayFetch
parce que, eh bien... vous pouvez, mais parce que vous voulez jouer à rapporter en ce moment. Si vous ne voulez pas jouer à rapporter, alors vous n'avez pas l'appeler. Si vous avez besoin pour jouer à rapporter dans une certaine situation, alors vous avez besoin de quelque chose qui peut rapporter. Vous vous assurez de cette interface de déclarations.Vous pouvez obtenir la même chose en utilisant l'héritage de classe, c'est un peu moins souple. Dans certains cas où les hiérarchies rigides exister bien qu'il est parfaitement utile:
Puis, dans certains contexte spécifique, vous ne pouvez exiger tout objet qui peut faire quelque chose (de l'interface), mais vous sont spécifiquement à la recherche d'un
GermanShepherd
, car elle seule peut être génial:Peut-être en bas de la route, vous ferez une nouvelle race de
GermanShepherd
s qui sont aussi génial, maisextend
laGermanShepherd
classe. Ils continuent à travailler avec leawesomeness
fonction, tout comme avec les interfaces.Ce que vous avez certainement ne devriez pas faire est de faire une boucle par un tas de petites choses au hasard, vérifier ce qu'ils sont et de leur faire faire leur propre chose. Ce n'est pas très raisonnable dans n'importe quel contexte.
interface Mammal extends Breathing, Walking, Jumping
.Un autre exemple de Polymorphisme en PHP
Presque la même chose que vous Krishnadas, Brad. Cet article m'a beaucoup aidé dans la compréhension de la façon de gérer le polymorphisme en PHP
http://code.tutsplus.com/tutorials/understanding-and-applying-polymorphism-in-php--net-14362