オブジェクト
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-
>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] 次のページ