オブジェクト指向プログラミング(英語: Object- Oriented programming、略称: OOP)において、オブジェクトとは、情報とその情報の処理方法の記述から構成される全体であり、現実世界を抽象化したものである。
現実の世界では、私たちが直面しているのはコンピューター、テレビ、自転車などの物体です。
オブジェクトには 3 つの主な特性があります。
オブジェクトの動作: オブジェクトにどのような操作を適用できるか、ライトをオンにするかライトをオフにするかが動作です。
オブジェクトの形状: これらのメソッドが適用されたときにオブジェクトがどのように反応するか、色、サイズ、外観。
オブジェクトの表現: オブジェクトの表現は ID カードに相当し、特に同じ動作とステータスの違いを区別します。
たとえば、Animal は抽象クラスであり、犬と羊を指定できます。犬と羊は色の属性を持ち、書き込み、実行、その他の動作状態を持ちます。
クラス-物の抽象的な特性を定義します。クラスの定義には、データの形式とデータに対する操作が含まれます。
オブジェクト- クラスのインスタンスです。
メンバー変数-クラス内で定義された変数。この変数の値は外部には見えませんが、クラスがオブジェクトとしてインスタンス化された後は、その変数をオブジェクトの属性と呼ぶことができます。
メンバー関数- クラス内で定義され、オブジェクトのデータにアクセスするために使用できます。
継承-継承は、サブクラスが親クラスのデータ構造とメソッドを自動的に共有するメカニズムです。これはクラス間の関係です。クラスを定義して実装するときは、既存のクラスに基づいて実行したり、既存のクラスによって定義されたコンテンツを独自のコンテンツとして取得したり、新しいコンテンツを追加したりできます。
親クラス-他のクラスによって継承されるクラスは、親クラス、基本クラス、またはスーパークラスと呼ばれます。
サブクラス-他のクラスから継承するクラスはサブクラスと呼ばれます。または、派生クラスとも呼ばれます。
ポリモーフィズム-ポリモーフィズムとは、同じ関数またはメソッドを複数の種類のオブジェクトに適用して、異なる結果を得ることができることを意味します。同じメッセージを受信したときに、オブジェクトが異なれば結果も異なる場合があります。この現象はポリモーフィズムと呼ばれます。
オーバーロード-簡単に言えば、関数またはメソッドの名前は同じですが、パラメーターリストが異なるこのような関数またはメソッドは、オーバーロードされた関数またはメソッドと呼ばれます。
抽象化-抽象化は、一貫したデータ構造(属性)と動作(操作)を持つオブジェクトをクラスに抽象化することを指します。クラスは、アプリケーションに関連する重要なプロパティを反映し、その他の無関係なコンテンツを無視する抽象化です。クラスの分割は主観的ですが、特定のアプリケーションに関連している必要があります。
カプセル化-カプセル化とは、現実世界に存在するオブジェクトのプロパティと動作を結合し、論理ユニット内に配置することを指します。
コンストラクター- 主にオブジェクトの作成時にオブジェクトを初期化するために使用されます。つまり、オブジェクトを作成するステートメント内で常に new 演算子と一緒に初期値を割り当てます。
デストラクター- デストラクター (デストラクター) コンストラクターとは対照的に、オブジェクトがそのライフサイクルを終了すると (たとえば、オブジェクトが配置されている関数が呼び出されたとき)、システムは自動的にデストラクターを実行します。デストラクターは、「クリーンアップ」作業を行うためによく使用されます (たとえば、オブジェクトを作成するとき、new を使用してメモリー空間を開きます。このメモリー空間は、終了する前にデストラクターの delete で解放する必要があります)。
以下の図では、Car クラスを通じて Mercedes、BMW、Audi の 3 つのオブジェクトを作成しました。
$メルセデス = 新車 ();$bmw = 新車 ();$アウディ = 新車 ();
PHP 定義クラスの通常の構文形式は次のとおりです。
<?phpclass phpClass { var $var1; var $var2 = "定数文字列" function myfunc ($arg1, $arg2) { [..] } [..]}?>
分析は次のとおりです。
クラスは、 classキーワードに続いてクラス名を使用して定義されます。
変数とメソッドは、クラス名の後の一対の中括弧 ({}) 内で定義できます。
クラス変数はvar を使用して宣言され、変数は初期化することもできます。
関数定義は PHP 関数定義に似ていますが、関数にはクラスとクラスがインスタンス化するオブジェクトを通じてのみアクセスできます。
<?phpclass サイト { /* メンバー変数*/ var $url; /* メンバー関数*/ function setUrl($par){ $this->url = $par; ->url .PHP_EOL; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title ; }}?>
変数$thisはそれ自体のオブジェクトを表します。
PHP_EOL は改行文字です。
クラスが作成された後、 new演算子を使用してそのクラスのオブジェクトをインスタンス化できます。
$codercto = 新しいサイト;$taobao = 新しいサイト;$google = 新しいサイト;
上記のコードでは、3 つのオブジェクトがそれぞれ独立しています。次に、メンバー メソッドとメンバー変数にアクセスする方法を見てみましょう。
オブジェクトをインスタンス化した後、そのオブジェクトを使用してメンバー メソッドを呼び出すことができます。オブジェクトのメンバー メソッドは、オブジェクトのメンバー変数に対してのみ操作できます。
// メンバー関数を呼び出してタイトルと URL を設定します $codercto->setTitle( "Coder Tutorial" );$taabao->setTitle( "Taobao" );$google->setTitle( "Google Search" );$codercto- > setUrl( 'www.codercto.com' );$taabao->setUrl( 'www.taabao.com' );$google->setUrl( 'www.google.com' );// メンバー関数を呼び出してタイトルと URL を取得します $codercto->getTitle();$taabao->getTitle();$google->getTitle();$codercto->getUrl();$taabao-> getUrl( );$google->getUrl();
完全なコードは次のとおりです。
<?php class Site { /* メンバー変数 */ var $ url ; /* メンバー関数 */ function setUrl ( $par ) { $this -> url = $par } function getUrl (){ echo $ this -> url ; } function setTitle ( $par ){ $ this - > title = $ par ; } function getTitle () { echo $this -> title ; }} $codercto = 新しいサイト; $ google = 新しいサイト; //メンバー関数を呼び出し、タイトルと URL を設定$ codercto - > setTitle ( " Coder Tutorial " ) ; " ); $google -> setTitle ( "Google 検索" ); $codercto -> setUrl ( 'www.codercto.com' ); $taabao -> setUrl ( 'www.taobao.com' ); $google -> setUrl ( 'www.google.com' ); // メンバー関数を呼び出してタイトルと URL を取得します$ codercto -> getTitle ( ) ; ) ; $ google - > getTitle ( ) ; $ codercto - > getUrl ( ) ;
上記のコードを実行すると、出力結果は次のようになります。
コード ファーマー チュートリアル タオバオ Google 検索 www.codercto.comwww.taabao.comwww.google.com
コンストラクターは特別な種類のメソッドです。これは主に、オブジェクトの作成時にオブジェクトを初期化するために使用されます。つまり、オブジェクトのメンバー変数に初期値を代入し、オブジェクトを作成するステートメント内のnew
演算子とともに使用します。
PHP 5 では、開発者は次の構文を使用して、クラス内のコンストラクターとしてメソッドを定義できます。
void __construct ([ 混合 $args [, $... ]] )
上の例では、コンストラクター メソッドを通じて $url 変数と $title 変数を初期化できます。
function __construct( $par1, $par2 ) { $this->url = $par1; $this->title = $par2;}
これで、setTitle メソッドと setUrl メソッドを呼び出す必要がなくなりました。
$codercto = 新しいサイト('www.codercto.com', 'コーダー チュートリアル');$taabao = 新しいサイト('www.taabao.com', 'Taobao');$google = 新しいサイト('www.google . com', 'Google 検索');//メンバー関数を呼び出してタイトルと URL を取得します $codercto->getTitle();$taabao->getTitle();$google->getTitle();$codercto->getUrl();$taabao->getUrl(); $google ->getUrl();
デストラクター (デストラクター) コンストラクターとは異なり、オブジェクトがそのライフサイクルを終了するとき (たとえば、オブジェクトが配置されている関数が呼び出されたとき)、システムは自動的にデストラクターを実行します。
PHP 5 では、他のオブジェクト指向言語と同様のデストラクターの概念が導入されました。その構文は次のとおりです。
void __destruct ( void )
<?phpclass MyDestructableClass { function __construct() { print "constructorn"; $this->name = "MyDestructableClass"; } function __destruct() { print "destroy" . }$obj = 新しい MyDestructableClass();?>
上記のコードを実行すると、出力結果は次のようになります。
コンストラクターは MyDestructableClass を破棄します
PHP では、キーワードextends を使用してクラスを継承します。形式は次のとおりです。
class Child extends Parent { // コード部分}
この例では、Child_Site クラスが Site クラスを継承し、その機能を拡張します。
<?php // 子クラスはサイトカテゴリを拡張します class Child_Site extends Site { var $category; function setCate($par){ $this->category = $par; } function getCate(){ echo $this->category ; }}
親クラスから継承されたメソッドがサブクラスのニーズを満たせない場合、このプロセスを書き換えることができます。このプロセスはメソッド オーバーライドと呼ばれ、メソッドの書き換えとも呼ばれます。
この例では、getUrl メソッドと getTitle メソッドがオーバーライドされます。
function getUrl() { echo $this->url . return $this->url;} function getTitle() { echo $this->title . return $this->title;}
PHP のプロパティまたはメソッドへのアクセス制御は、キーワード public (パブリック)、protected (保護された)、または private (プライベート) を先頭に追加することで実現されます。
public: public クラスのメンバーにはどこからでもアクセスできます。
protected:保護されたクラス メンバーは、それ自体、そのサブクラス、および親クラスからアクセスできます。
プライベート:プライベート クラス メンバーには、それが定義されているクラスからのみアクセスできます。
クラス属性は、public、protected、または private のいずれかとして定義する必要があります。 var で定義されている場合は、パブリックとみなされます。
<?php/** * MyClass の定義 */class MyClass{ public $public = 'Public'; protected $protected = 'Protected'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; }}$obj = new MyClass();echo $obj->public // この行は通常通り実行できます。 // この行は致命的なエラーを生成します echo $obj->private; // この行も致命的なエラーを生成します $obj->printHello() // 出力 Public、Protected、および Private/** * MyClass2 を定義します */ class MyClass2 extends MyClass{ // public と protected は再定義できますが、private ですが保護されません $protected = 'Protected2' { echo $this->public echo; $this->protected; echo $this->private; }}$obj2 = new MyClass2();echo $obj2->public; // この行は通常通り実行できます echo $obj2->private;定義 $obj2->protected; // この行は致命的なエラーを生成します $obj2->printHello(); // 出力 Public、Protected2、および Unknown?>
クラス内のメソッドは、パブリック、プライベート、または保護として定義できます。これらのキーワードが設定されていない場合、メソッドはデフォルトで public になります。
<?php/** * Define MyClass */class MyClass{ // パブリック コンストラクターを宣言します public function __construct() { } // パブリック メソッドを宣言します public function MyPublic() { } // protected メソッドを宣言します protected function MyProtected( ) { } // プライベート メソッドを宣言します private function MyPrivate() { } // このメソッドはパブリック関数です Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); }}$myclass = new MyClass;$myclass->MyPublic(); // この行は通常どおり実行できます。この行は致命的なエラーを生成します $myclass->MyPrivate(); // この行は致命的なエラーを生成します $myclass->Foo(); // public、protected、および private はすべて実行できます /** * Define MyClass2 */class MyClass2 extends MyClass{ // このメソッドはパブリック関数です Foo2() { $this->MyProtected(); // この行は致命的なエラーが発生します}} $myclass2 = new MyClass2;$myclass2->MyPublic(); // この行は正常に実行できます $myclass2->Foo2();パブリックなものと保護されたものはどちらも実行できますが、プライベートなものは実行できません。 :testPublicn"; } プライベート関数 testPrivate() { echo "Bar::testPrivaten"; }}class Foo extends Bar { public function testPublic() { echo "Foo::testPublicn"; } private function testPrivate() { echo "Foo::testPrivaten" }}$myFoo = new foo();$myFoo->test(); // Foo::testPublic?>
インターフェイスを使用すると、クラスが実装する必要があるメソッドを指定できますが、これらのメソッドの特定の内容を定義する必要はありません。
インターフェイスは、標準クラスの定義と同様に、 interfaceキーワードを通じて定義されますが、その中で定義されているメソッドはすべて空です。
インターフェイスで定義されるすべてのメソッドはパブリックである必要があります。これはインターフェイスの特性です。
インターフェイスを実装するには、 implements演算子を使用します。クラスは、インターフェイスで定義されているすべてのメソッドを実装する必要があります。実装しない場合は、致命的なエラーが報告されます。クラスは複数のインターフェイスを実装できます。複数のインターフェイスの名前を区切るにはカンマを使用します。
<?php// 'iTemplate' インターフェイスを宣言しますinterface iTemplate{ public function setVariable($name, $var); public function getHtml($template);}// インターフェイス class Template を実装します iTemplate{ private $vars = array( ) ; パブリック関数 setVariable($name, $var) { $this->vars[$name] = $var } パブリック関数 getHtml($template) { foreach($this->vars as $name => $value) { $template = str_replace('{' . $name . '}', $value, $template) } return $template;
クラス全体で変更されない値は定数として定義できます。定数を定義および使用するときに $ 記号を使用する必要はありません。
定数の値は固定値である必要があり、変数、クラス属性、数学的演算の結果、または関数呼び出しにすることはできません。
PHP 5.3.0 以降、変数を使用してクラスを動的に呼び出すことができます。ただし、この変数の値をキーワード (self、parent、static など) にすることはできません。
<?phpclass MyClass{ const constant = 'constant value'; function showConstant() { echo self::constant . }}echo MyClass::constant ;$classname = "MyClass";echo $classname::constant 。 PHP_EOL; // 5.3.0 以降 $class = new MyClass();$class->showConstant();echo $class::constant . // PHP 5.3.0 以降?>
クラス内の少なくとも 1 つのメソッドが抽象宣言されている場合は、クラスを抽象宣言する必要があります。
抽象として定義されたクラスはインスタンス化できません。
抽象として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関数の実装を定義することはできません。
抽象クラスを継承する場合、サブクラスは親クラス内のすべての抽象メソッドを定義する必要があります。また、これらのメソッドのアクセス制御は親クラスと同じ (またはより緩和された) 必要があります。たとえば、抽象メソッドが protected として宣言されている場合、サブクラスに実装されているメソッドは protected または public として宣言する必要があり、private として定義することはできません。
<?phpabstract class AbstractClass{ // サブクラスでこれらのメソッドを定義するのは必須です abstract protected function getValue(); abstract protected function prefixValue($prefix); // 通常のメソッド (非抽象メソッド) public function printOut(); - >getValue() . }}class ConcreteClass1 extends AbstractClass{ protected function getValue() { return "ConcreteClass1"; prefixValue($prefix) { return "{$prefix}ConcreteClass1" }}class ConcreteClass2 extends AbstractClass{ public function getValue() { return "ConcreteClass2" } public function prefixValue($prefix) { return "{$prefix}ConcreteClass2"; ; }}$class1 = 新しい ConcreteClass1;$class1->printOut();echo $class1->prefixValue('FOO_') . PHP_EOL;$class2 = new ConcreteClass2;$class2->printOut();echo $class2->prefixValue('FOO_') ;?>
上記のコードを実行すると、出力結果は次のようになります。
ConcreteClass1FOO_ConcreteClass1ConcreteClass2FOO_ConcreteClass2
さらに、子クラスのメソッドには、親クラスの抽象メソッドには存在しないオプションのパラメータを含めることができます。
たとえば、サブクラスが親クラスの抽象メソッドの宣言に含まれていないオプションのパラメーターを定義している場合でも、サブクラスは通常どおり実行できます。
<?phpabstract class AbstractClass{ // 抽象メソッドは必要なパラメータを定義するだけで済みます abstract protected function prefixName($name);}class ConcreteClass extends AbstractClass{ // サブクラスは親クラスのシグネチャに存在しないオプションのオプションを定義できますパラメータ public function prefixName($name, $separator = ".") { if ($name == "パックマン") { $prefix = "ミスター" } elseif ($name == "パックウーマン") { $prefix = "夫人"; } else { $prefix = "" } return "{$prefix}{$separator} {$name}"; $class = new ConcreteClass;echo $class->prefixName(" "), "n";echo $class->prefixName("パックウーマン"), "n";?>
出力は次のとおりです。
ミスター・パックマンミセス・パックウーマン
クラス属性またはメソッドを静的として宣言すると、クラスをインスタンス化せずに直接アクセスできます。
インスタンス化されたクラスのオブジェクトを介して静的プロパティにアクセスすることはできません (ただし、静的メソッドはアクセスできます)。
静的メソッドではオブジェクトを呼び出す必要がないため、静的メソッドでは疑似変数 $this を使用できません。
-> 演算子を使用してオブジェクトから静的プロパティにアクセスすることはできません。
PHP 5.3.0 以降、変数を使用してクラスを動的に呼び出すことができます。ただし、この変数の値をキーワード self、parent、または static にすることはできません。
<?phpclass Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static; }}print Foo::$my_static ;$foo = new Foo- >staticValue() .PHP_EOL;?>
上記のプログラムを実行すると、出力結果は次のようになります。
ふふふ
PHP 5 では、新しい Final キーワードが追加されています。親クラスのメソッドがfinalと宣言されている場合、子クラスはそのメソッドをオーバーライドできません。クラスがfinal宣言されている場合、そのクラスを継承することはできません。
次のコードを実行するとエラーが報告されます。
<?phpclass BaseClass { public function test() { echo "BaseClass::test() が呼び出された" . PHP_EOL; } Final public function moreTesting() { echo "BaseClass::moreTesting() が呼び出された" }}class ChildClass extends BaseClass { public function moreTesting() { echo "ChildClass::moreTesting() が呼び出されました" }}//エラー メッセージ 致命的なエラー: 最終メソッド BaseClass::moreTesting() をオーバーライドできません?>
PHP は、子クラスのコンストラクターで親クラスのコンストラクターを自動的に呼び出しません。親クラスのコンストラクターを実行するには、子クラスのコンストラクターでparent::__construct()を呼び出す必要があります。
<?phpclass BaseClass { function __construct() { print "BaseClass クラスのコンストラクター メソッド" . }}class SubClass extends BaseClass { function __construct() { // サブクラスのコンストラクターは親を自動的に呼び出すことはできません。クラスのコンストラクター メソッド print "SubClass クラスのコンストラクター メソッド" }}class OtherSubClass extends BaseClass { // BaseClass のコンストラクター メソッドを継承します。 BaseClass コンストラクターを呼び出します $obj = new BaseClass(); // BaseClass コンストラクターと SubClass コンストラクターを呼び出します $obj = new SubClass() // BaseClass コンストラクターを呼び出します $obj = new OtherSubClass();?>
上記のプログラムを実行すると、出力結果は次のようになります。
BaseClass クラスのコンストラクター メソッド Class SubClass のコンストラクター メソッド BaseClass クラスのコンストラクター メソッド