ホームページ php教程 php手册 PHPの必須オブジェクト型instanceof演算子

PHPの必須オブジェクト型instanceof演算子

Jun 21, 2016 am 09:11 AM
attributes function output this

オブジェクト

1. はじめに

PHP で必須のオブジェクト型を実装することは、非常に重要な場合があります。これが欠落している場合、知識不足 (間違ったプログラミングの前提に基づくもの) または単に怠惰が原因で、特定の Web アプリケーションで予期しない結果が表示されることになります。特に PHP 4 でプログラミングする場合、「is_a()」関数 (他のメソッドもありますが) を使用して、作業しているオブジェクトの型を確認するのが非常に簡単です。もちろん、オブジェクト型の強制を使用して、同じアプリケーション内の他の PHP クラスにパラメータとして渡す必要がある入力オブジェクトをフィルタリングすることもできます。

ただし、PHP 4 はそのオブジェクト モデルに関するいくつかの弱点を明らかにしていません。成熟したオブジェクト指向言語に見られる特定の機能を実装するために、追加のコードの作成が必要になる場合があります。この事実は PHP コミュニティでは長い間知られていました。ただし、PHP 5 のリリースでは、これらの非常に価値のある機能の多くが、改良されたオブジェクト モデルの一部として追加されました。これらは、オブジェクトベースのコード開発をより厳密に実装するのに役立ち、特定のオブジェクトの特性を使用できるようになります。

上記の場合、オブジェクト型の強制に関しては特別な注意を払う必要があります。実際、PHP 5 は、Web アプリケーションの実行中にオブジェクトの型をチェックする少なくとも 2 つの方法を開発者に提供します。それらは、「instanceof」演算子と「型ヒント」機能です。ここでこの記事の本題に戻り、PHP 5 の「instanceof」演算子の使用法を紹介します。操作しているオブジェクトが特定の型に属しているかどうかを判断するのに非常に便利であることがすぐにわかります。

この記事は、いくつかのオブジェクト指向の例を通して、PHP 5 で必須のオブジェクト型を実装する方法を理解するのに役立ちます。

2. やってはいけないこと

PHP 5 でオブジェクト型強制を実装する方法を示すために、(X)HTML ウィジェット クラスと単純なページ ビルダー クラスを使用し、PHP に合わせて単純な Modified を作成します。 5 開発環境。

最初の例では、抽象基本クラス「HTMLElement」から派生したいくつかの (X)HTML ウィジェット クラスをリストします。これは、入力オブジェクトの型のチェックをスキップします。まず次のクラスを見てください:

// 抽象クラス 'HTMLElement' を定義します。 Exception('無効な属性タイプ');
}
$this->attributes=$attributes;
}
//Abstract 'getHTML()' Method
abstract protected function getHTML();
}
//Define specific Class 'Div' - extends HTMLElement
class Div extends HTMLElement{
private $output='<div ';
private $data;
public function __construct($ attributes=array(),$data){
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.'</div>';
return $this->output;
}
}
//特定のクラス 'Header1' を定義します -extends HTMLElement
class Header1 extends HTMLElement {
private $output='<h1 ';
private $data;
public function __construct($attributes=array(),$data) {
parent::__construct($attributes);
$this->data=$ data;
}
//「getHTML()」メソッドの具体的な実装
public function getHTML(){
foreach($this- >属性を $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
}
$this->output=substr_replace($this->output ,'>',-1);
$this->output.=$this->data.'</h1>';
return $this->output;
}
}
//特定のクラスを定義する 'パラグラフ'-extend HTMLElement
class パラグラフ extends HTMLElement{
private $output='

private $data;
public function __construct($attributes=array(),$data){
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.'</p>';
return $this->output;
}
}
//具象クラス 'UnownedList' を定義する -extend HTMLElement
class UnownedList 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('リスト項目のパラメータが無効です');
}
$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.'
  • ';
    }
    $this->output.='</ul>';
    return $this->output;
    }
    }
    ご覧のとおり、上記の (X)HTML ウィジェット クラスは、 web これは非常に便利ですが、入力パラメータの妥当性を検証できないように、意図的にクラスごとにコードを書きました。ご想像のとおり、入力パラメーターはクラス コンストラクターに直接渡され、プロパティとして割り当てられます。これを行うことに何か問題があるのでしょうか?という疑問が生じます。はいあります。ここで、最も単純なページ ビルダー クラスを定義し、このようなウィジェットをフィードして、このクラスへの入力がどのように不正なオブジェクトと混合されるかを確認します。以下はページ ジェネレーター クラスの署名です:

    class PageGenerator{
    private $output='';
    private $title;
    public function __construct($title='Default Page'){
    $this->title= $ title;
    }
    public function doHeader(){
    $this->output=''.$this-<br> >title.' '
    </html>';
    }
    public function fetchHTML(){
    return $this->output;
    }
    }
    ここで、いくつかの (X)HTML ウィジェット オブジェクトをインスタンス化し、対応するジェネレーターに渡し始めます。次の例に示すように、header クラス:

    try{
    //いくつかの HTML 要素を生成する
    $h1=new Header1(array('name'=>'header1','class'=>'headerclass'),' H1
    要素のコンテンツはここにあります');
    $div=new Div(array('name'=>'div1','class'=>'divclass'),'Div要素
    のコンテンツはここにあります');
    $par=new grammar(array('name'=>'par1','class'=>'parclass'),'Content for Plaza
    element opens here');
    $ul=new UnownedList(array ('name' =>'リスト1', 'クラス'=>'リストクラス')、配列
    ('アイテム1'=>'値1', 'アイテム2'=>'値2', 'アイテム3'=>'値3'));
    / /ページジェネレータークラスをインスタンス化します
    $pageGen=new Page Generator();
    $pageGen->doHeader();
    // 'HTMLElement'オブジェクトを追加します
    $pageGen->addHTMLElement($h1);
    $pageGen->addHTMLElement ($div);
    $pageGen->addHTMLElement($par);
    $pageGen->addHTMLElement($ul);
    $pageGen->doFooter();
    //メッシュを表示
    echo $pageGen-> fetchHTML() ;
    }
    catch(Exception $e){
    echo $e->getMessage();
    exit();
    }
    上記の PHP コードを実行すると、得られる結果は単純な Web ページです。これにはいくつかの ( X)以前に作成されたHTMLオブジェクト。この場合、何らかの理由でページ ビルダー クラスが不正なオブジェクトを受け取り、その "addHTML()" メソッドを呼び出した場合に何が起こるかを理解するのは簡単です。ここでは、存在しない (X)HTML ウィジェット オブジェクトを使用して、競合状態を作り直しました。以下のコードをもう一度見てください:

    try{
    //いくつかのHTML要素を生成します
    $h1=new Header1(array('name'=>'header1', 'class'=>'headerclass'), 'Content for H1
    要素がここに入ります');
    $div=new Div(array('name'=>'div1','class'=>'divclass'),'Div要素
    の内容がここに入ります');
    $par =new Paragraph(array('name'=>'par1','class'=>'parclass'),'ここに段落
    要素のコンテンツが入ります');
    $ul=new UnownedList(array ('name'=> 'list1', 'class'=>'listclass'), array
    ('item1'=>'value1', 'item2'=>'value2', 'item3'=>'value3'));
    //例カスタマイズされたページジェネレータークラス
    $pageGen=new Page Generator();
    $pageGen->doHeader();
    //'HTMLElement'オブジェクトを追加
    $pageGen->addHTMLElement($fakeobj) //次の'HTMLElement'オブジェクトを追加します存在しません このメソッドに
    渡されたオブジェクト
    $pageGen->addHTMLElement($div);
    $pageGen->addHTMLElement($par);
    $pageGen->addHTMLElement($ul);
    $pageGen->doFooter() ;
    / / Webを表示する
    echo $pageGen->fetchHTML();
    }
    catch(Exception $e){
    echo $e->getMessage();
    exit();
    }
    この場合、以下の 1 行で表示されます:

    $pageGen->addHTMLElement($fakeobj)//存在しないオブジェクトをこのメソッドに渡します
    存在しない (X)HTML ウィジェット オブジェクトがページ ジェネレーター クラスに渡されます。致命的なエラー:

    致命的なエラー:
    path/to/file 内の非オブジェクトのメンバー関数の呼び出し

    どうでしょうか?これは、ジェネレーター クラスに渡されたオブジェクトの型をチェックしないことによる直接的なペナルティです。したがって、スクリプトを作成するときは、この点に必ず留意してください。幸いなことに、これらの問題には簡単な解決策があり、ここで「instanceof」演算子の力が役に立ちます。この演算子がどのように使用されるかを知りたい場合は、読み続けてください。

    [1] [2] 次のページ



    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    機能とはどういう意味ですか? 機能とはどういう意味ですか? Aug 04, 2023 am 10:33 AM

    ファンクションとは、関数を意味します。これは、特定の関数を備えた再利用可能なコード ブロックです。プログラムの基本コンポーネントの 1 つです。入力パラメータを受け取り、特定の操作を実行し、結果を返すことができます。その目的は、再利用可能なコード ブロックをカプセル化することです。コードの再利用性と保守性を向上させるコード。

    PHP8 で属性を使用してコードの注釈を管理するにはどうすればよいですか? PHP8 で属性を使用してコードの注釈を管理するにはどうすればよいですか? Oct 18, 2023 am 09:48 AM

    PHP8 で属性を使用してコードの注釈を管理するにはどうすればよいですか? PHP8 のリリースにより、属性というエキサイティングな新機能が導入されました。属性は、構造化された方法でクラス、メソッド、属性にメタデータを追加できるようにするコード アノテーションの方法です。この記事では、属性を使用して PHP8 でコードの注釈を管理する方法を検討し、いくつかの具体的なコード例を示します。 1. 属性とは何ですか?

    Python の「enumerate()」関数の目的は何ですか? Python の「enumerate()」関数の目的は何ですか? Sep 01, 2023 am 11:29 AM

    この記事では、Python の enumerate() 関数と「enumerate()」関数の目的について学びます。 enumerate() 関数とは何ですか? Python の enumerate() 関数は、データ コレクションをパラメータとして受け取り、列挙オブジェクトを返します。列挙オブジェクトはキーと値のペアとして返されます。キーは各項目に対応するインデックス、値は項目です。構文 enumerate(iterable,start) パラメータ iterable - 渡されたデータ コレクションは、iterablestart と呼ばれる列挙オブジェクトとして返すことができます。 - 名前が示すように、列挙オブジェクトの開始インデックスは start によって定義されます。無視したら

    MySQL.procテーブルの役割と機能の詳しい説明 MySQL.procテーブルの役割と機能の詳しい説明 Mar 16, 2024 am 09:03 AM

    MySQL.proc テーブルの役割と機能の詳細な説明。MySQL は人気のあるリレーショナル データベース管理システムです。開発者が MySQL を使用する場合、多くの場合、ストアド プロシージャ (StoredProcedure) の作成と管理が必要になります。 MySQL.proc テーブルは非常に重要なシステム テーブルであり、ストアド プロシージャの名前、定義、パラメータなど、データベース内のすべてのストアド プロシージャに関連する情報が保存されます。この記事では、MySQL.proc テーブルの役割と機能について詳しく説明します。

    PHP8 で属性を使用してクラスにカスタム アノテーションを追加するにはどうすればよいですか? PHP8 で属性を使用してクラスにカスタム アノテーションを追加するにはどうすればよいですか? Oct 18, 2023 am 10:16 AM

    PHP8 で属性を使用してクラスにカスタム アノテーションを追加するにはどうすればよいですか?カスタム アノテーションは、クラスまたはメソッドにメタデータを追加する方法であり、実行時に特定のクラスまたはメソッドに関する追加情報を取得して処理するのに役立ちます。 PHP8 では、属性の概念が導入され、クラスにカスタム アノテーションを簡単に追加できるようになりました。この記事では、属性を使用して PHP8 のクラスにカスタム アノテーションを実装する方法を紹介し、具体的なコード例を示します。 PHP8では、

    Vue2 がこれを通じてさまざまなオプションのプロパティにアクセスできる理由について話しましょう Vue2 がこれを通じてさまざまなオプションのプロパティにアクセスできる理由について話しましょう Dec 08, 2022 pm 08:22 PM

    この記事は、vue ソース コードを解釈するのに役立ち、これを使用して Vue2 のさまざまなオプションのプロパティにアクセスできる理由を紹介します。

    この点を理解してフロントエンド担当者の7割をキャッチアップした記事 この点を理解してフロントエンド担当者の7割をキャッチアップした記事 Sep 06, 2022 pm 05:03 PM

    同僚は、これによって指摘されたバグのために立ち往生しました。Vue2 のこの指摘の問題により、アロー関数が使用され、その結果、対応する props を取得できなくなりました。私がそれを彼に紹介したとき、彼はそれを知りませんでした。その後、私はわざとフロントエンド コミュニケーション グループに目を向けました。これまでのところ、フロントエンド プログラマーの少なくとも 70% はまだそれを理解していません。今日私はそれを共有しますyou this link. もしすべてが間違っている場合 まだ学習していない場合は、大きな口を与えてください。

    フロントエンド出力設定 フロントエンド出力設定 Feb 19, 2024 am 09:30 AM

    フロントエンドの出力構成には特定のコード例が必要です。フロントエンド開発において、出力構成は非常に重要な構成です。これは、プロジェクトのパッケージ化後に生成されるファイル パス、ファイル名、および関連リソース パスを定義するために使用されます。この記事では、フロントエンド出力構成の役割、一般的な構成オプションを紹介し、具体的なコード例を示します。出力構成の役割: 出力構成アイテムは、プロジェクトのパッケージ化後に生成されるファイル パスとファイル名を指定するために使用されます。それがプロジェクトの最終的な成果物を決定します。 webpackなどにパッケージ化されています。

    See all articles