PHPの必須オブジェクト型instanceof演算子
オブジェクト
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='
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.='
}
$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='
>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] 次のページ

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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