Maison > développement back-end > tutoriel php > Utilisation étendue de l'opérateur de type PHP 'instanceof'

Utilisation étendue de l'opérateur de type PHP 'instanceof'

伊谢尔伦
Libérer: 2023-03-10 22:56:01
original
1424 Les gens l'ont consulté

L'opérateur

"instanceof" fonctionne bien dans la vérification du type des objets d'entrée qui sont injectés directement dans la classe génératrice de la page. Maintenant, allons plus loin et ajoutons une routine de vérification au constructeur et à la méthode "getHTML()" de la classe de widget (X)HTML afin qu'ils puissent accepter d'autres widgets comme paramètres d'entrée. Veuillez consulter les classes améliorées ci-dessous :

class Div extends HTMLElement{
 private $output='<div ';
 private $data;
 public function construct($attributes=array(),$data){
  if(!$data instanceof HTMLElement&&!is_string($data)){
   throw new Exception('Invalid parameter type');
  }
  parent::construct($attributes);
  $this->data=$data;
 }
 //'getHTML()'方法的具体实现
 public function getHTML(){
  foreach($this->attributes as $attribute=>$value){
   $this->output.=$attribute.'="'.$value.'" ';
  }
  $this->output=substr_replace($this->output,'>',-1);
  $this->output.=($this->data instanceof HTMLElement)?
  $this->data->getHTML():$this->data;
  $this->output.='</div>';
  return $this->output;
 }
}
class Header1 extends HTMLElement{
 private $output='<h1 ';
 private $data;
 public function construct($attributes=array(),$data){
  if(!$data instanceof HTMLElement&&!is_string($data)){
   throw new Exception('Invalid parameter type');
  }
  parent::construct($attributes);
  $this->data=$data;
 }
 //'getHTML()'方法的具体实现
 public function getHTML(){
  foreach($this->attributes as $attribute=>$value){
   $this->output.=$attribute.'="'.$value.'" ';
  }
  $this->output=substr_replace($this->output,'>',-1);
  $this->output.=($this->data instanceof HTMLElement)?
  $this->data->getHTML():$this->data;
  $this->output.='</h1>';
  return $this->output;
 }
}
class Paragraph extends HTMLElement{
 private $output='<p ';
 private $data;
 public function construct($attributes=array(),$data){
  if(!$data instanceof HTMLElement&&!is_string($data)){
   throw new Exception('Invalid parameter type');
  }
  parent::construct($attributes);
  $this->data=$data;
 }
 //'getHTML()'方法的具体实现
 public function getHTML(){
  foreach($this->attributes as $attribute=>$value){
   $this->output.=$attribute.'="'.$value.'" ';
  }
  $this->output=substr_replace($this->output,'>',-1);
  $this->output.=($this->data instanceof HTMLElement)?
  $this->data->getHTML():$this->data;
  $this->output.='</p>';
  return $this->output;
 }
}
class UnorderedList extends HTMLElement{
 private $output='<ul ';
 private $items=array();
 public function construct($attributes=array(),$items=array()){
  parent::construct($attributes);
  if(!is_array($items)){
   throw new Exception('Invalid parameter for list items');
 }
 $this->items=$items;
}
//'getHTML()'方法的具体实现
public function getHTML(){
 foreach($this->attributes as $attribute=>$value){
  $this->output.=$attribute.'="'.$value.'" ';
 }
 $this->output=substr_replace($this->output,'>',-1);
 foreach($this->items as $item){
  $this->output.=($item instanceof
  HTMLElement)?'<li>'.$item->getHTML().'</li>':'<li>'.$item.'</li>';
 }
 $this->output.='</ul>';
 return $this->output;
}
}
Copier après la connexion

Comme indiqué dans les classes ci-dessus, afin de permettre l'implémentation d'éléments (X)HTML imbriqués lors de la génération de la page Web correspondante, les Construct respectifs leur constructeur et leur méthode "getHTML()". Veuillez noter que le bloc conditionnel suivant est inclus dans le constructeur de chaque classe :

if(!$data instanceof HTMLElement&&!is_string($data)){
throw new Exception('Invalid parameter type');
}
Copier après la connexion

À ce stade, ce qui est réellement fait est de s'assurer que seules les données de chaîne et les objets de type "HTMLElement" sont autorisés comme paramètres d’entrée pour chaque classe. Sinon, une exception sera levée par la méthode respective et pourra entraîner l’arrêt de l’exécution de l’application. C'est donc le processus de vérification des données d'entrée. Regardons maintenant la nouvelle signature de la méthode "getHTML()", qui utilise également l'opérateur "instanceof" :

$this->output.=($this->data instanceof HTMLElement)?$this->data-
>getHTML():$this->data;
Copier après la connexion

Comme vous pouvez le voir, dans ce cas, cet opérateur est très utile pour profiter de la fonctionnalité polymorphe de la classe (X)HTML widget. Si l'attribut $data est également un widget, alors sa méthode "getHTML()" sera appelée correctement, ce qui entraînera l'affichage de l'élément Web imbriqué. En revanche, s'il ne s'agit que d'une chaîne, alors elle est ajoutée directement à toutes les sorties de la classe actuelle.

À ce stade, afin de vous assurer que certains objets appartiennent à un type spécifique, vous avez peut-être compris l'utilisation de l'opérateur "instanceof" en PHP 5. Comme vous pouvez le voir dans cet article, forcer les types d'objets dans PHP 5 est en fait une tâche assez simple. Pour l'instant, vous feriez mieux de développer un exemple d'utilisation de cette méthode pour filtrer des objets dans votre application PHP afin d'approfondir votre compréhension.

<?php
//定义一个抽像类HTMLElement
abstract class HTMLElement
{
    protected  $attributes;
    protected  function construct($_attributes)
    {
        if(!is_array($_attributes))
        {
           throw new Exception("attributes not is array"); 
        }
        $this->attributes = $_attributes;
    }
    //定义一个虚函数
    abstract function getHTML();
}
 
 
//定义具体的类"Div"扩展HTMLElement
class Div extends HTMLElement
{
    private $_output = "<div";
    private $_data;
    public function construct($_attributes=array(), $data)
    {
        //扩展"instanceof"操作符的使用:嵌套(X)HTML widget
        if(!$data instanceof HTMLElement && !is_string($data)) {
            throw new Exception("data type error");
        }      
        parent::construct($_attributes);
        $this->_data = $data;
    }
    public function getHTML()
    {
        foreach ($this->attributes as $key=>$val)
        {
             $this->_output.=  " ".$key."=&#39;".$val."&#39; ";
        }
        $this->_output =substr_replace($this->_output,">",-1);
        $this->_output .= $this->_data instanceof HTMLElement ? $this->_data->getHTML()."</div>" : $this->_data."</div>";
        return $this->_output;
    }
}
 
//定义具体的类"H1"扩展
class h1 extends HTMLElement
{
    private $_output="<h1";
    private $_data;
    public function construct($_attributes=array(), $data)
    {
        parent::construct($_attributes);
        $this->_data = $data;
    }
     
    public function getHTML()
    {
        foreach($this->attributes as $key=>$val)
        {
            $this->_output.=  " ".$key."=&#39;".$val."&#39; ";
        }
        $this->_output = substr_replace($this->_output, ">", -1);
        $this->_output .= $this->_data."<h1>";
        return $this->_output;
    }
}
 
//定义具体的类"ul"
class ul extends HTMLElement
{
    public $output = "<ul";
    private $ulitem=array();
    public function construct($_attributes=array(), $_ulitem=array())
    {  
        parent::construct($_attributes);
        $this->ulitem = $_ulitem;
    }
     
    public function getHTML()
    {
        foreach($this->attributes as $key=>$val)
        {
            $this->_output.=  " ".$key."=&#39;".$val."&#39; ";
        }
        $this->output = substr_replace($this->output, ">",-1);
        foreach($this->ulitem as $ukey=>$uval){
            $this->output .="<li>".$uval."</li>";
        }
        $this->output.="</ul>";
        return $this->output;       
    }
}
 
 
//生成页面的类
class PageGenerator
{
    private $_output;
    private $_title;
    public function construct($title=" Default page")
    {
        $this->_title = $title;
    }
     
    public function doHead()
    {
        $this->_output.="<html><head><title>".$this->_title."</title></head><body>";
    }
     
//  public function addHTMLElement($HTMLElement)
//  {
//      $this->_output.= $HTMLElement->getHTML();
//  }
    //对addHTMLElement进行改进
    //可以保证传入的不是HTMLElement类对像直接报错
    public function addHTMLElement($HTMLElement)
    {
         if(!$HTMLElement instanceof HTMLElement)
         {
            throw new Exception(&#39;Invalid (X)HTML element&#39;);
         }
         $this->_output.= $HTMLElement->getHTML();
    }
 
    public function doFooter()
    {
        $this->_output.="</body></html>";
    }
     
    public function fetchHTML()
    {
        return $this->_output;
    }
}
 
try{   
    $attribute = array("class"=>"className", "style"=>"color:#000");
    $h1 = new H1($attribute, "h1内容");
    $attribute = array("class"=>"className", "style"=>"color:#000");
    $ul = new ul($attribute, array("li第一行内容","li第二行内容","li第三行内容"));
     
     
    $attribute = array("class"=>"className", "style"=>"color:red");
    $div = new Div($attribute, $ul);
    $page = new PageGenerator();
//  $str="我是个字符串";
//  $page->addHTMLElement($str);
    $page->addHTMLElement($h1);
    $page->addHTMLElement($div);
    //  $page->addHTMLElement($ul);
    echo $page->fetchHTML();    
}
catch(Exception $e){
    echo $e->getMessage();
    die();
}
?>
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