検索
ホームページバックエンド開発PHPチュートリアルPHP におけるオブジェクト指向プログラミング: 大規模な PHP プロジェクトへのアプローチ_PHP チュートリアル

この記事では、PHP のオブジェクト指向プログラミング (OOP) について紹介します。オブジェクト指向の概念を使用して、より少ないコードでより優れたプログラムを作成する方法を示します。皆さんの幸運を祈ります。

オブジェクト指向プログラミングの概念は、作成者ごとに異なる見解があります。オブジェクト指向言語が持つべきものを思い出させてください:
- データの抽象化と情報の隠蔽
- 継承
- ポリモーフィズム

PHP におけるクラスの使用方法カプセル化の場合:

class Something {
// OOP では、クラスは通常、大文字で始まります
var $x;

function setX($v) {
// メソッドは小文字で始まります。区切るには小文字を使用します
// メソッド名内の単語 EXAMPLE GETVALUEAREA () on getx () {
Return $ this- & gt
}
}
?> もちろん、独自のメソッドを使用することもできます。しかし、基準を持つことは常に良いことです。

PHPのクラスのデータメンバーは、値が割り当てられるまでは「var」を使用して定義されます。データ メンバーは、整数、配列、連想配列 (連想配列)、またはオブジェクトの場合があります。メソッドは、クラス内の関数として定義されます。メソッド内のデータ メンバーにアクセスするには、次のように $this->name を使用する必要があります。このメソッド、それ以外の場合は、メソッドの関数のローカル変数です。

new を使用してオブジェクトを作成します

$obj = new Something;

その後、メンバー関数

$obj->setX(5); を使用します

setX The member function assigns 5 to the member variable in the object (not the member) obj, and then getX returns the value 5.

また、オブジェクト参照を使用してメンバー変数にアクセスすることもできます。例: $obj->x =6; ただし、これはオブジェクト指向プログラミングにとって良いアプローチではありません。メンバー変数の値を設定するにはメンバー関数を使用し、メンバー変数を読み取るにはメンバー関数を使用することを強くお勧めします。メンバー関数を使用する以外はメンバー変数にアクセスできないと信じているなら、あなたは優れたオブジェクト指向プログラマーになれるでしょう。しかし残念ながら、PHP 自体には変数をプライベートとして宣言する方法がないため、不正なコードが存在することが許されています。

PHPにおける継承はextendを使って宣言します。


class Another extends Something {
var $y;
function setY($v) {
// メソッドは小文字で始まり、小文字で区切られます
// メソッド名の例 getValueOfArea() { このように、クラス「Another」のオブジェクトは、親クラスのプロパティ、使用されるメンバー変数とメソッド関数、さらに独自のメンバー変数とメンバー関数を持ちます。例:

$obj2=new Another;
$obj2->setX(6);

多重継承はサポートされていないため、1 つのクラスに複数のクラスを継承させることはできません。 。

継承されたクラスでは、メソッドを再定義するために再定義できます。「Another」で getX を再定義すると、同様に、継承されたクラスで同じメンバー変数を宣言すると、「Something」のメンバー関数 getX にアクセスできなくなります。名前を親クラスと同じ名前にすると、継承クラスの変数は親クラスと同じ名前の変数を非表示にします。

クラスのコンストラクターを定義できます。コンストラクターはクラスと同じ名前のメンバー関数で、クラスのオブジェクトを作成するときに呼び出されます。


class Something {
var $x;

function Something($y) {
$this->x=$y
}
function set X($v) {
$ this ->x=$v;

function getX() {
return $this->

コンストラクターは値 5 をメンバー変数 x に自動的に代入します。コンストラクター関数とメンバー関数は通常の PHP 関数であるため、デフォルトのパラメーターを使用できます。

function Something($x="3",$y="5")

次に:

$obj=new Something(); // x=3 および y=5
$obj=new Something(8) ); // x=8 および y=5
$obj=new Something(8,9); // x=8 および y=9

デフォルトのパラメータは C++ と同じように定義されているため、渡すことはできません値 Y を指定しますが、X にはデフォルト値を指定します。引数は左から右に渡され、引数がなくなると関数はデフォルトの引数を使用します。

継承クラスのコンストラクタが呼び出されたときのみ、継承クラスのオブジェクトが作成され、親クラスのコンストラクタは呼び出されないのがPHPの特徴です。コンストラクター呼び出しチェーンはオブジェクト指向プログラミングの専門分野です。基本クラスのコンストラクターを呼び出したい場合は、継承クラスのコンストラクターで明示的に呼び出す必要があります。これが機能するのは、親クラスのすべてのメソッドが継承されたクラスで使用できるためです。

function Another() {
$this->y=5;
$this->Something(); // 基本クラスのコンストラクターへの明示的な呼び出し
?>オブジェクト指向プログラミングの優れたメカニズムは、抽象クラスを使用することです。抽象クラスはインスタンス化できませんが、継承されたクラスのインターフェイスを定義するために使用されます。デザイナーは、プログラマに特定の基本クラスからのみ継承させるために抽象クラスをよく使用します。これにより、新しいクラスが必要な機能を備えていることを確認できますが、PHP にはこれを行う標準的な方法はありません。これは、コンストラクターで「die」を呼び出すことで基本クラスを定義するときに必要になります。これにより、抽象クラスの関数を定義し、各関数で「die」を呼び出すことができます。クラス内のプログラマが再定義を行わずに基底クラスの関数を直接呼び出すと、エラーが発生します。さらに、PHP には型がないため、一部のオブジェクトは基本クラスから継承する継承クラスから作成されることを確認する必要があります。そのため、クラスを識別するメソッド (「何らかの識別子」を返す) を基本クラスに追加し、これを検証します。受け取ったときにオブジェクトにパラメータとして渡すと便利です。しかし、不正なプログラムに対する解決策はありません。不正なプログラムは継承されたクラスでこの関数を再定義できるため、通常、この方法は怠惰なプログラマにしか機能しません。もちろん、最善の方法は、プログラムが基本クラスのコードに触れないようにして、インターフェイスのみを提供することです。

PHPではオーバーロードはサポートされていません。オブジェクト指向プログラミングでは、異なるパラメーターの型と数値を定義することによって、同じ名前のメンバー関数をオーバーロードできます。 PHP は型付けが緩い言語であるため、パラメーターの型のオーバーロードは役に立ちません。同様に、異なる数のパラメーターを使用したオーバーロードも機能しません。

オブジェクト指向プログラミングでは、コンストラクターをオーバーロードすると、さまざまな方法で (さまざまな数のパラメーターを渡すことで) さまざまなオブジェクトを作成できるようになり、便利な場合があります。ちょっとしたトリックでこれを行うことができます:

class Myclass {
function Myclass() {
$this->$name();
/ /Note $this->$name() は通常間違っていますが、ここでは
//$name は呼び出すメソッドの名前を含む文字列です
}

function Myclass1($x) {
}

Function Myclass2($x,$y) {
Code;
}
}
?>

このメソッドを通じて、オーバーロードの目的を部分的に達成できます。

$obj1=new Myclass(1); //Myclass1 を呼び出します
$obj2=new Myclass(1,2); //Myclass2 を呼び出します

とても良い感じです。

ポリモーフィズム

ポリモーフィズムとは、実行時にオブジェクトがパラメーターとして渡されたときに、どのメソッドを呼び出すかを決定するオブジェクトの機能として定義されます。たとえば、クラスを使用してメソッド "draw" を定義し、そのクラスを継承して円または正方形を描く "draw" の動作を再定義すると、パラメータ x を持つ関数が得られます。 call $x->draw( ) ポリモーフィズムがサポートされている場合、「draw」メソッドの呼び出しはオブジェクト x のタイプによって異なります。ポリモーフィズムは PHP で当然サポートされています (C++ コンパイラーでコンパイルされた場合、どのメソッドが呼び出されるか考えてみてください。ただし、オブジェクトの型が何であるかはわかりません。もちろん、現在はそうではありません)。幸いなことに、PHP はポリモーフィズムをサポートしています。

function niceDrawing($x) {
//これがクラス Board のメソッドであると仮定します。
$x->draw();

$obj=new Circle(3,187);
$obj2=new Rectangle(4,5);

$board->niceDrawing($obj); //Circle の描画メソッドを呼び出します。 Rectangle の描画メソッドを呼び出します
?>

PHP におけるオブジェクト指向プログラミング

純粋なオブジェクト理論家は、PHP は真のオブジェクト指向言語ではないと考えていますが、それは正しいことです。 PHP はハイブリッド言語であり、オブジェクト指向または従来の構造プログラミング手法と併用できます。ただし、大規模なプロジェクトの場合は、純粋なオブジェクト指向のアプローチを使用してクラスを定義し、プロジェクト内でオブジェクトとクラスのみを使用する必要がある場合があります。プロジェクトが大きくなるほど、オブジェクト指向のアプローチを使用すると、保守が容易になり、理解しやすく、再利用しやすくなります。これがソフトウェアエンジニアリングの基本です。 Web サイトのデザインでこれらの概念を使用することが、将来の成功の鍵となります。

Advanced Object-Oriented Techniques in PHP

オブジェクト指向の基本概念を確認した後、より高度なテクニックをいくつか紹介します。

シリアル化

PHP は永続オブジェクトをサポートしていません。オブジェクト指向言語では、永続オブジェクトとは、アプリケーションによって複数回呼び出された後も状態と機能を維持するオブジェクトです。これは、オブジェクトをファイルに保存する方法があることを意味します。 . またはデータベースを選択してから、オブジェクトをリロードします。このメカニズムはシリアル化と呼ばれます。 PHP には、オブジェクトに対して呼び出すことができるシリアル化関数があり、オブジェクトを表す文字列を返します。次に、シリアル化関数は、メンバー関数の代わりにメンバー データを保存します。

PHP4では、オブジェクトを文字列$sにシリアル化し、そのオブジェクトを削除して、オブジェクトを$objに逆シリアル化しても、オブジェクトのメソッド関数を呼び出すことができます。ただし、(a) この機能は将来サポートされなくなる可能性があり、(b) シリアル化されたオブジェクトをディスクに保存してプログラムを終了するとファントムが発生するため、このアプローチはお勧めしません。シリアル化された文字列はメンバー関数を表さないため、このオブジェクトを逆シリアル化し、将来このスクリプトを再実行するときにオブジェクトのメソッドがまだ有効であることを期待することはできません。最後に、保存されたオブジェクトのメンバー変数をシリアル化することは、PHP では非常に便利です (連想配列と配列をディスクにシリアル化できます)。

例:

$obj=new Classfoo();
$str=serialize($obj);
// $str をディスクに保存

//...数か月後

/ /Load str from disc
$obj2=unserialize($str)
?>

上記の例では、メンバー関数なしでメンバー変数を復元できます(ドキュメントによると)。その結果、$obj2->x がメンバー変数にアクセスする唯一の方法になります (メンバー関数がないため)。

この問題を解決する方法は他にもいくつかありますが、このきれいな文書が台無しになるため、それはあなたに残します。
PHP が将来的にシリアル化を完全にサポートすることを願っています。

クラスを使用して保存データを操作する

PHP とオブジェクト指向プログラミングの優れた点の 1 つは、何かを操作するためのクラスを簡単に定義し、必要に応じて適切なクラスを呼び出すことができることです。 HTML ファイルがあり、製品の ID 番号を選択して製品を選択する必要があるとします。データはデータベースに保存されており、価格などの製品情報を表示したいとします。さまざまな種類の製品があり、同じアクションでも製品ごとに異なる意味を持ちます。たとえば、サウンドの表示はその再生を意味しますが、他の製品ではデータベースに保存されている画像を表示することもあります。オブジェクト指向プログラミングと PHP を使用すると、より少ないコードで、より優れた方法で実行できます。

クラスを定義し、そのクラスが持つべきメソッドを定義し、継承によって各プロダクトクラス(SoundItemクラス、ViewableItemクラスなど)を定義し、各プロダクトクラスのメソッドを必要なものに再定義します。データベースに保存するテーブルの製品タイプ フィールドに基づいて、製品タイプごとにクラスを定義します。一般的な製品テーブルにはフィールド (ID、タイプ、価格、説明など) があります。スクリプトでは、データベース テーブルから型情報を取得し、対応するクラスのオブジェクトをインスタンス化します。
$obj=new $type();
?> ;

これは、オブジェクトの型を気にせずに、$obj の表示メソッドやその他のメソッドを呼び出すことができるという特徴です。この手法を使用すると、新しいタイプのオブジェクトを追加するときにスクリプトを変更する必要がありません。このメソッドは少し強力です。タイプに関係なくすべてのオブジェクトが持つ必要があるメソッドを定義し、それらをさまざまなクラスでさまざまな方法で実装することで、スクリプト内のさまざまなタイプのオブジェクトにメソッドを使用できます。 , 二人のプログラマーが同じファイルで満足することはありません。プログラミングがこんなに楽しいものだと思いますか?メンテナンスの負担が少なく、再利用可能ですか?

プログラマのグループを率いる場合、各人が特定のクラスとオブジェクトを担当できるようにタスクを分割するのが最善の方法です。国際化は、ユーザーが選択したさまざまな言語に適切なクラスを対応させるなど、同じ手法を使用して解決できます。

コピーとクローン

オブジェクト $obj を作成するとき、$obj2 = $obj を使用してオブジェクトをコピーできます。新しいオブジェクトは $obj のコピー (参照ではない) であるため、代入後は新しいオブジェクトがコピーされます。 object has $obj は新しい状態と同じです。場合によっては、これを望まず、単に obj と同じ新しいオブジェクトを作成し、new コマンドを使用したかのように新しいオブジェクトのコンストラクターを呼び出したい場合があります。これは、PHP のシリアル化と、他のクラスが継承する必要がある基本クラスを使用することによって実現できます。


危険ゾーンへの突入

オブジェクトをシリアル化すると、特定の形式の文字列が得られます。興味がある場合は、文字列内の 1 つの要素を解凍してみてください。 :

$herring = Serialize($obj);
$vec =explode(":",$herring);
$nam = str_replace(""", "" , $vec[2]) ;
?>

クラス「Universe」を作成し、すべてのクラスを「Universe」から継承させると、「Universe」に clone メソッドを定義できます:

< ;?php
class Universe {
function __clone( ) {
$herring=serialize($this);
$vec=explode(":",$herring);
$nam=str_replace(""", "", $vec[2]);
バース!!
$ other=$obj->__clone();
?>

取得するものは、 new を使用するのと同じように、コンストラクターが呼び出されます。これがうまくいくかどうかはわかりませんが、ユニバース クラスが継承元のクラスの名前を知っていることは良い習慣です。あなたに課せられるのはあなたの想像力だけです! ! !

注: 私は PHP4 を使用しています。記事内の一部の内容は PHP3 には適していない可能性があります。

-終わり-

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/317165.html技術記事この記事では、PHP のオブジェクト指向プログラミング (OOP) について紹介します。オブジェクト指向の概念を使用して、より少ないコードでより優れたプログラムを作成する方法を示します。皆さんの幸運を祈ります。 オブジェクト指向プログラミングの入門...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?Apr 23, 2025 am 12:16 AM

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?Apr 23, 2025 am 12:13 AM

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

session.gc_maxlifetime構成設定とは何ですか?session.gc_maxlifetime構成設定とは何ですか?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでセッション名をどのように構成しますか?PHPでセッション名をどのように構成しますか?Apr 23, 2025 am 12:08 AM

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。

セッションIDをどのくらいの頻度で再生する必要がありますか?セッションIDをどのくらいの頻度で再生する必要がありますか?Apr 23, 2025 am 12:03 AM

セッションIDは、機密操作の前、30分ごとにログイン時に定期的に再生する必要があります。 1.セッション固定攻撃を防ぐためにログインするときにセッションIDを再生します。 2。安全性を向上させるために、敏感な操作の前に再生します。 3.定期的な再生は長期的な利用リスクを減らしますが、ユーザーエクスペリエンスの重量を量る必要があります。

PHPでセッションCookieパラメーターをどのように設定しますか?PHPでセッションCookieパラメーターをどのように設定しますか?Apr 22, 2025 pm 05:33 PM

PHPのセッションCookieパラメーターの設定は、session_set_cookie_params()関数を通じて達成できます。 1)この関数を使用して、有効期限、パス、ドメイン名、セキュリティフラグなどのパラメーターを設定します。 2)session_start()を呼び出して、パラメーターを有効にします。 3)ユーザーログインステータスなど、ニーズに応じてパラメーターを動的に調整します。 4)セキュリティを改善するために、セキュアとhttponlyフラグを設定することに注意してください。

PHPでセッションを使用する主な目的は何ですか?PHPでセッションを使用する主な目的は何ですか?Apr 22, 2025 pm 05:25 PM

PHPでセッションを使用する主な目的は、異なるページ間でユーザーのステータスを維持することです。 1)セッションはsession_start()関数を介して開始され、一意のセッションIDを作成し、ユーザーCookieに保存します。 2)セッションデータはサーバーに保存され、ログインステータスやショッピングカートのコンテンツなど、さまざまなリクエスト間でデータを渡すことができます。

サブドメイン間でセッションをどのように共有できますか?サブドメイン間でセッションをどのように共有できますか?Apr 22, 2025 pm 05:21 PM

サブドメイン間でセッションを共有する方法は?一般的なドメイン名にセッションCookieを設定することにより実装されます。 1.セッションCookieのドメインをサーバー側の.example.comに設定します。 2。メモリ、データベース、分散キャッシュなど、適切なセッションストレージ方法を選択します。 3. Cookieを介してセッションIDを渡すと、サーバーはIDに基づいてセッションデータを取得および更新します。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、