Exemples détaillés de deux méthodes pour implémenter le polymorphisme PHP

伊谢尔伦
Libérer: 2023-03-11 22:12:01
original
2012 Les gens l'ont consulté

Le concept de polymorphisme en Java fait référence au type d'objet vers lequel une variable peut pointer, qui est une sous-classe du type de déclaration de variable. Une fois un objet créé, son type reste inchangé. Le polymorphisme est une variable

En PHP5, le type d'une variable n'est pas défini. Une variable peut pointer vers n'importe quel type de valeur numérique, string, objets, ressources, etc. On ne peut pas dire que le polymorphisme en PHP5 est une variable.

Nous pouvons seulement dire qu'en PHP5, le polymorphisme est appliqué dans la position de l'indice de type des paramètres de la méthode.

Tout objet de sous-classe d'une classe peut satisfaire à l'exigence de type avec le type actuel comme indice de type.
Toutes les classes qui implémentent cette interface peuvent répondre aux exigences des paramètres de méthode en utilisant le type d'interface comme indice de type.
En termes simples, une classe a l'identité de sa classe parent et l'interface implémentée.

Réalisez le polymorphisme en implémentant des interfaces

<?php
interface User{ // User接口
    public function  getName();
    public function setName($_name);
}
class NormalUser implements User { // 实现接口的类.
    private $name;
    public function getName(){
        return $this->name;
    }
    public function setName($_name){
        $this->name = $_name;
    }
}
class UserAdmin{ //操作.
    public 
static
 function  ChangeUserName(User $_user,$_userName){
        $_user->setName($_userName);
    }
}
$normalUser = new NormalUser();
UserAdmin::ChangeUserName($normalUser,"Tom");//这里传入的是 NormalUser的实例.
echo $normalUser->getName();
?>
Copier après la connexion

Utilisez les interfaces et la composition pour simuler plusieurs héritage

Simulez l'héritage multiple grâce à la composition.

L'héritage multiple n'est pas pris en charge en PHP. Si nous voulons utiliser les méthodes de plusieurs classes pour réaliser la réutilisation du code, existe-t-il un moyen ?

C'est une combinaison. Dans une classe, définissez une autre classe sur l'attribut

.

L'exemple suivant simule l'héritage multiple.

Exemple d'interface

Écrivez un exemple conceptuel. Nous concevons un système de vente en ligne, et la partie utilisateur est conçue comme suit : Les utilisateurs sont divisés en trois types : NormalUser, VipUser et InnerUser. Il est nécessaire de calculer le prix du produit acheté par l'utilisateur en fonction des différentes remises accordées à l'utilisateur. Et nécessitent que de l'espace soit réservé pour une expansion et une maintenance futures.

<?php
interface User
{
    public function getName();
    public function setName($_name);
    public function getDiscount();
}
abstract class AbstractUser implements User
{
    private $name = "";
    protected  $discount = 0;
    protected  $grade = "";
    function construct($_name) {
        $this->setName($_name); 
    }
    function getName() {
        return $this->name;
    }
    function setName($_name) {
    $this->name = $_name;
    }
    function getDiscount() {
        return $this->discount;
    }
    function getGrade() {
        return $this->grade;
    }
}
class NormalUser 
extends
 AbstractUser
{
    protected $discount = 1.0;
    protected $grade = "Normal";
}
class VipUser extends AbstractUser
{
    protected $discount = 0.8;
    protected $grade = "VipUser";
}
class InnerUser extends AbstractUser
{
    protected $discount = 0.7;
    protected $grade = "InnerUser";
}
interface Product
{
    function getProductName();
    function getProductPrice();
}
interface Book extends Product
{
    function getAuthor();
}
class BookOnline implements Book
{
    private $productName;
    protected $productPrice;
    protected $Author;
    function construct($_bookName) {
        $this->productName = $_bookName;
    }
    function getProductName() {
        return $this->productName;
    }
    function getProductPrice() {
        $this->productPrice = 100;
        return $this->productPrice;
    }
    public function getAuthor() {
        $this->Author = "chenfei";
        return $this->Author;
    }
}
class Productsettle
{
    public static function finalPrice(User $_user, Product $_product, $number) {
        $price = $_user->getDiscount() * $_product->getProductPrice() * $number;
        return $price;
    }
}
$number = 10;
$book = new BookOnline("
设计模式
");
$user = new NormalUser("tom");
$price = Productsettle::finalPrice($user, $book, $number);
$str = "您好,尊敬的" . $user->getName() . "<br />";
$str .= "您的级别是" . $user->getGrade() . "<br />";
$str .= "您的折扣是" . $user->getDiscount() . "<br />";
$str .= "您的价格是" . $price;
echo $str;
?>
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!