ホームページ > php教程 > php手册 > PHPのクラス

PHPのクラス

WBOY
リリース: 2016-06-21 09:10:43
オリジナル
1095 人が閲覧しました

PHP のクラス
著者: Cool Bear

PHP を使用する上で最も理解するのが難しい概念は、PHP のクラスだと思います。 MySQL の基本的な知識を学んだことを除けば、他のデータベース エンジンを使用した経験はありません。これまで OOP オブジェクト指向プログラミングの経験がありませんでしたが、OOP の原理とその強力な理由を理解することで、OOP を使用してプログラムを実装することがどのようなものかをある程度理解できるようになりました。間違いなく強力なプログラムを手に入れることができますが、この理解をプログラミングの実践に適用せずに単に仕組みを理解したと考えている場合、OOP は常に机上の空論のレベルにとどまります。そこで、数日前、通常の関数を使用して一部の機能を実装するときに、オブジェクトを使用して実装してみたところ、確かに作業が簡単になることがわかりました。そこで、私のような人たちの助けになればと思い、これらの経験について書きました。

端的に言うと、クラスはいくつかの変数 (OOP 概念におけるメンバー変数、訳者注) と、これらの変数を操作するいくつかの関数 (OOP 概念におけるメンバー関数) のコレクションです。これは、プログラム内で現実の用語で問題を考える方法、つまりオブジェクトを説明する方法を提供します。逆に、オブジェクトまたはインスタンスは、このクラスの実際の実装です。たとえば、自転車を説明したいとします。適切な自転車クラスには次の変数が含まれている必要があります: $pedals (ペダル)、$chain (チェーン)、$front Wheel (前輪)、$rear Wheel (後輪)、$brakes (ブレーキ)、および $handl_bars(ハンドルバー)。実際の自転車の操作を参考にしてスクリプトを実装できます。たとえば、$Braking_Force を関数 Accelerate() に渡し、この変数を定義したインスタンスの他の変数 ($front_wheel、$rear_wheel など) に適用したり、操作の結果を返して対応する操作を実装したりできます。 。

見た目は綺麗ですが、これは通常の関数や変数でも実現できないのでしょうか?はい、プログラム内に自転車のインスタンスが 1 つしかない場合、それに対して別のクラスを定義することはあまり意味がありません。しかし、多数の自転車インスタンスが必要な場合はどうすればよいでしょうか?ただし、プログラム内の変数の受け渡しフローは非常に複雑になります。各自転車インスタンスで指定された変数がさまざまな関数に正しく受け渡されることを常に確認する必要があります。ただし、オブジェクトを使用すると、渡す変数の数が大幅に減ります。これは、オブジェクト内の処理関数 (翻訳者によるいわゆるメソッド) が、スコープがこのオブジェクトに限定されていると自動的に判断されるためです。そのため、オブジェクトが操作できる内容も制限されます。オブジェクトのスコープに限定されます。また、オブジェクト定義はさまざまなスクリプトに簡単に含めることができるため、さまざまなスクリプトで各バイクが同じように動作することが保証されます。

サイトのほぼすべてのページで使用する実際のクラスを作成してみましょう。参考になるものが見つかるかもしれません。

あなたの状況はわかりませんが、私にとって、動的な Web ページを書くときに最も嫌いなことは、プログラム フローについて考えるのを時々中断し、代わりに適切なプレゼンテーションについて考えなければならないことです。 HTMLの形式。その結果、フォント、フォントサイズ、背景、テキストの色を考慮するエネルギーがあまりないため、最終的に作成したページはあまり魅力的ではありません。解決策は、PHP クラスを通じてテキストをフォーマットし、HTML の出力属性をカスタマイズすることです。


このクラスに「スタイル」という名前を付けました。 HTML 属性の設定に重要な次のメンバー変数が含まれています。

var $text;
var $bgcol; ;
var $face;
var $size;
var $valign;

?> 上記の変数名はすでによく理解されていると思います。 . HTML 構文での名前。次に、Style クラスに Style という名前のメンバー関数を作成します。


class Style {

function Style ($text= "#000000",$alink= "#AA00AA",$vlink= "#AA00AA",$link= "#3333FF",$bgcol = "#999999",$face= "ブック アンティクア",$size=3,$align= "CENTER",$valign= "TOP") {

$this->text=$text; >alink=$alink;
$this->vlink=$vlink;
$this->bgcol=$bgt; ;
$this->size=$size;
$this->valign=$valign;

}

クラス内にそのクラスと同じ名前のメンバー関数を作成すると、そのクラスのインスタンスを作成するたびにこの関数が実行されます。この関数はコンストラクターと呼ばれます。このメカニズムを使用して、オブジェクトが作成されるたびに各 HTML 属性変数にデフォルト値を自動的に割り当てます。

上記の構文「=new ClassName;」は、クラス Style のインスタンス $Basic を宣言します。

クラスのインスタンスを宣言する際にパラメーターを渡すことで、クラス内の変数に異なる値を指定できます。ただし、変数の 1 つだけを変更することを宣言した場合でも、他のメンバー変数の値も指定する必要があります。この観点から見ると、クラスと通常の関数は同じです。たとえば、Style クラスのテキスト変数にデフォルト値以外の値を指定する場合は、他の変数も指定する必要があります。しかし、もっと簡単な方法があります (実際、これは一般的に使用される方法であり、新しいものではありません - 翻訳者注)。それは、クラスにメンバー関数を追加することによって、クラス内の変数の値を変更することです:


Function Set($varname,$value) {

$this->$varname=$value;

}

?> 次に、指定された変数の値を変更するコードを実装します。オブジェクトインスタンス内。

Set( 'size', '2');

オブジェクトである変数または関数を宣言するには、「->」演算子を使用する必要があります。上記のコードは、コード インタプリタに「$Basic で Set() メンバー関数を実行する」ように指示します。インタプリタは、$Basic が以前に宣言されているため、クラス Style のインスタンスであることを認識します。同様に、次のコード ($Basic->text など) を通じてインスタンスの変数を参照できます。

プロパティがデフォルト値とは若干異なるヘッダー スタイル オブジェクトを作成してみましょう。


$Theader= 新しいスタイル;
$Theader->Set( 'text', '#0000FF');
$Theader->Set( 'bgcol', '#000000');

?>

ここにいるだけで十分ですよね?これで、テーブルのヘッダーに青のテキストと黒の北京が表示されました。また、表の本体をホームページより少し明るいグレーにして、表の本体に黒のテキストと小さなテキストを入れたいと思いました。そのため、次のようにすることができます。 ;Set( 'bgcol', '#AAAAAA');
$Tbody->Set( 'size',2);

これでまだ使えます 彼は何をしに来たのですか?良い質問!この質問をしてよかったです。 Style を任意の HTML ページ オブジェクトで使用できるように、クラス内にさらにいくつかのメンバー関数を作成する必要があります。最初に行う必要があるのは、ページのプロパティを設定することです:


function Body() {

PRINT "" TEXT="$this->テキスト" "。
"LINK="$this->link" VLINK="$this->vlink" "。 > ";

}

?>

上記のコードは、サイト内のすべてのページの全体的なスタイルを設定します。変数「$this」も設計されています。この変数はクラス内でのみ使用され、インタプリタはそれを現在のオブジェクト自体を参照しているメンバー変数として自動的に理解します。つまり、$this 変数は、アプリケーション内のオブジェクト名 (この例では $Basic) と同義です。ここで行っていることは、通常の関数を使用して実装するよりも確かに単純であることに注意してください。この変数は、関数に渡さずに関数内で参照できます。通常、通常の関数は、いくつかのグローバル変数配列を通じてこのメカニズムを実装できます。ただし、すべてのオブジェクト変数とメンバー関数のスコープがこのオブジェクトのスコープ内にあることを宣言する必要があります。

次の PHP コードを試してください (Style クラスを組み込み、そのインスタンス $Basic を作成し、ページにすでに タグがあると仮定します)

Body(); ?>

ページに何かを出力するには、従来の方法を使用できますが、別の方法を使用したいと思います... (この著者は気取っていて、過度にユーモアがあります - 翻訳者注) ) これは私が使用する別のメンバー関数 TextOut です:


function TextOut($message= " ") {

PRINT " "text">$message " }

?>
この関数にはパラメータ $message が必要です。 $message は出力したいテキストです。関数は指定された属性を持つテキストを出力します。これは次のメソッドで実現できます:


$Basic->TextOut( 'This is my test message');
$Tbody->TextOut( ' -- ちょっといいですね?' );

?>2 つの関数の間には復帰や改行がないため、結果は同じ行に出力されることに注意してください。また、2 番目の部分のフォントも小さくしたいので、これを上記の $Tbody オブジェクトで宣言しました。$Tbody と $Basic の唯一の違いは、ここでは役に立ちません。 。プログラム宣言の「 」に注目してください。これは、関数にパラメータが渡されず、以下で説明する理由により関数がデフォルトの非改行スペースを出力する場合に使用されます。

これまでのところ、私たちの作業は保存されていません。最後の例では、クラス全体を変更せずに、出力構文の途中でもフォントの色やサイズを簡単に変更する方法を示します。次のコードを追加します:


function TDOut ($message= " ",$colspan=1) {

PRINT ""ALIGN="$this->align" VALIGN="$this->valign">";
$this->TextOut($message);
PRINT "" ;

}

?>

それではここで説明は終わりです!テーブルの背景色を変更するには、次のようにします。

$Theader->TDOut( "Name",2) ;
$Theader->TDOut( "場所",3);


$ ;
$Theader->TDOut( "市");
$Theader->TDOut( "州/県"); "国");

?>


宣言されていない場合のデフォルト値は 1 です。したがって、最初の行「名前」では 2 つの列が結合され、「場所」行では 3 つの列が結合されます。 2 行目では、すべての列が 1 つにマージされます。

次の方法でテーブル本体を実装します。



$Tbody->TDOut( "Kreisler");
$Tbody->TDOut( "コートランド");
$Tbody->TDOut( "アメリカ");

でも、まだ少し面倒に思えます。もっと手順を節約できますか?次に、次の関数を使用します:


function TROut($message) { /*魚についてはコメントしないでください ;) */

PRINT "
"; explode( "|",$message);
$iterations=count($cells);
while ($ilist($message,$span)=explode( ": ",$cells[$i]);
if (strlen($message)if ($span){
$this->TDOut ($message,$span);
}else{
$this->TDOut ($message);
}
$i++;
PRINT "

"

?>少し面倒に思えますので、詳しく見てみましょう:

3 行目は、「|」記号に従って文字列を分解し、分解された各要素を配列 $cell に入れます。 4 行目は、配列内の配列要素の数を $iterations に取得します。6 行目は、配列内の各要素を処理するループを開始します。 7 行目では、区切り文字として「:」を使用して配列要素を分解し、$message と $span に格納します。 8 行目では、$message に値があるかどうかを確認します。そうでない場合は、デフォルト値を割り当てます。 9 行目は、$span があるかどうかを確認します (つまり、セルが結合されているかどうかは、$cell データ内のコロンの後の $span によって決まります)。存在する場合は、10 行目で TDOut 関数を呼び出し、$message を渡します。行 12 がない場合、プログラムは単に $message 情報を出力します (TDOut 関数は、$colspan 属性を設定するためにデフォルト値 1 を使用します)。最後に、テーブルの行を終了します ( 経由)。

読んだ後もまだ少し混乱しているかもしれませんが (そうでなかったら奇妙です)、必要な情報をすべて含めるためにこれを TROut パラメーターに渡す方法は何でしょうか?正しい形式は次のとおりです: celldata[:colspan]|celldata[:colspan]|...celldata[:colspan] (セルは | で区切られ、セル内のデータの後に : で区切られた結合されたセルの数が続きます)拡張するセルの数 - 翻訳者注)

これまでに行った作業を要約すると、テーブル ヘッダーとテーブル本体は次の呼び出しで完成します:


TROut( "名前:2|住所:3");
$Tbody->TROut( "最初|最後|市区町村|国"); "ロッド|クライスラー|コートランド|ニューヨーク|アメリカ");
?>


うわー、とても簡単ではありませんか? (実際、これは非常に単純ですが、著者が書いた内容だけでは人々がこれを認識するには十分ではありません。つまり、示されている例では説得力がありません。個人的には、TROut のコード行に依存して行を出力するのは難しいと感じています)もちろん、この記事は PHP の OOP の入門コースとして、少なくとも BBS の例を使用するのが合理的です。ほぼすべての側面をカバーしています。)

セル内のデータが変数に格納されている場合はどうなりますか?配列に参加するだけです:


$message=join($arry, "|");
$Tbody->TROut($message);

もちろん、あなたは結合で列拡張のセルの数を同時に入力することはできませんが、もう 1 つ使用することはできます。配列に 6 つの要素が含まれており、3 行目と 4 行目をそれぞれ 2 セルと 3 セル拡張する必要があるとします。次のコードを使用して実装できます。 $ 配列;
$newarray[2]=join(list($newarray[2],"2"),":");
$newarray[4]=join(list($newarray[4],"3") ) ,":");
$message=join($newarray,"|");
$Tbody->TROut($message); 明らかに、さらにメンバー関数を追加できます。もっと良いアイデアをお持ちの方がいらっしゃいましたら、私にメールしていただければ、さらにコードをカプセル化して公開します。







関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート