PHP オブジェクト指向
オブジェクト指向プログラミング(英語: Object- Oriented Programming、略稱: OOP)において、オブジェクトとは、情報(bào)とその情報(bào)を処理する方法の記述から構(gòu)成される全體であり、現(xiàn)実世界を抽象化したものです。
現(xiàn)実の世界で私たちが直面しているのは、コンピューター、テレビ、自転車などの物體です。
オブジェクトの主な 3 つの特性:
· オブジェクトの動(dòng)作: オブジェクトにどのような操作を適用できるか、ライトをオンにするかライトをオフにするかがビヘイビアーです。
· オブジェクトの形狀: メソッドが適用されたときのオブジェクトの反応、色、サイズ、外観。
· オブジェクトの表現(xiàn): オブジェクトの表現(xiàn)は、同じ動(dòng)作や狀態(tài)の違いを明確に區(qū)別します。
たとえば、Animal は犬と羊を指定できる抽象クラスであり、犬と羊は色の屬性を持ち、書き込み、実行、その他の動(dòng)作狀態(tài)を持ちます。
オブジェクト指向コンテンツ
· クラス-物の抽象的な特性を定義します。クラスの定義には、データの形式とデータに対する操作が含まれます。
· オブジェクト - クラスのインスタンスです。
· メンバー変數(shù) - クラス內(nèi)で定義された変數(shù)。この変數(shù)の値は外部には見えませんが、クラスがオブジェクトとしてインスタンス化された後は、その変數(shù)をオブジェクトの屬性と呼ぶことができます。
· メンバー関數(shù) - クラス內(nèi)で定義され、オブジェクトのデータにアクセスするために使用できます。
· 継承 - 継承は、サブクラスが親クラスのデータ構(gòu)造とメソッドを自動(dòng)的に共有するメカニズムです。これはクラス間の関係です。クラスを定義して実裝するときは、既存のクラスに基づいて実行したり、既存のクラスによって定義されたコンテンツを獨(dú)自のコンテンツとして取得したり、新しいコンテンツを追加したりできます。
· 親クラス - クラスは他のクラスによって継承されます。このクラスは、親クラス、基本クラス、またはスーパークラスと呼ばれます。
· サブクラス - 他のクラスを継承するクラスはサブクラスと呼ばれます。または、派生クラスと呼ばれることもあります。
· ポリモーフィズム - ポリモーフィズムとは、同じ操作、関數(shù)、またはプロセスが複數(shù)の種類のオブジェクトに適用され、異なる結(jié)果が得られることを意味します。同じメッセージを受信したときに、オブジェクトが異なれば結(jié)果も異なる場合があります。この現(xiàn)象はポリモーフィズムと呼ばれます。
· オーバーロード - 簡単に言えば、同じ名前で異なるパラメータリストを持つ関數(shù)またはメソッドが、オーバーロードされた関數(shù)またはメソッドと呼ばれる狀況です。
· 抽象化 - 抽象化とは、一貫したデータ構(gòu)造 (屬性) と動(dòng)作 (操作) を持つオブジェクトをクラスに抽象化することを指します。クラスは、アプリケーションに関連する重要なプロパティを反映し、その他の無関係なコンテンツを無視する抽象化です。クラスの分割は主観的ですが、特定のアプリケーションに関連している必要があります。
· カプセル化 - カプセル化とは、現(xiàn)実世界に存在するオブジェクトのプロパティと動(dòng)作を結(jié)合し、論理ユニット內(nèi)に配置することを指します。
?コンストラクター - 主にオブジェクトの作成時(shí)にオブジェクトを初期化するために使用されます。つまり、オブジェクトを作成するステートメント內(nèi)で常に new 演算子と一緒に使用されます。
· デストラクター ? デストラクター (デストラクター) コンストラクターとは対照的に、オブジェクトがそのライフサイクルを終了するとき (たとえば、オブジェクトが配置されている関數(shù)が呼び出されたとき)、システムは自動(dòng)的にデストラクターを?qū)g行します。デストラクターは、「クリーンアップ」作業(yè)を行うためによく使用されます (たとえば、オブジェクトを作成するとき、new を使用してメモリー空間を開きます。このメモリー空間は、終了する前にデストラクターの delete で解放する必要があります)。
下の図では、Car クラスを通じて Mercedes、Bmw、Audi の 3 つのオブジェクトを作成しました。
$mercedes = 新車 ();
$bmw = 新車 ();
$audi = 新車 ();
PHP クラス定義
PHP クラスを定義するための通常の構(gòu)文形式は次のとおりです:
<?php class phpClass { var $var1; var $var2 = "constant string"; function myfunc ($arg1, $arg2) { [..] } [..] } ?>
分析は次のとおりです:
· クラスは、class キーワードに続いてクラス名を使用して定義されます。
· 変數(shù)とメソッドは、クラス名の後の中括弧 ({}) 內(nèi)で定義できます。
· クラス変數(shù)はvarを使って宣言されており、変數(shù)の初期化も可能です。
· 関數(shù)定義は PHP 関數(shù)定義に似ていますが、関數(shù)にはクラスとそれがインスタンス化するオブジェクトを通じてのみアクセスできます。
インスタンス
<?php class Site { /* 成員變量 */ var $url; var $title; /* 成員函數(shù) */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url ."<br/>"; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title . "<br/>"; } }?>
変數(shù) $this はそれ自體のオブジェクトを表します。
PHP でのオブジェクトの作成
クラスが作成された後、new 演算子を使用してこのクラスのオブジェクトをインスタンス化できます:
$php = new Site;
$taobao = new Site;
$ google = 新しいサイト;
上記のコードでは、3 つのオブジェクトがそれぞれ獨(dú)立しています。次に、メンバー メソッドとメンバー変數(shù)にアクセスする方法を見てみましょう。
//メンバー関數(shù)を呼び出してタイトルとURLを設(shè)定します
$php->setTitle( "php中文網(wǎng)" );
$taabao->setTitle( "淘寶" );
$google-> ;setTitle ( "Google 検索" );
$php->setUrl( 'ipnx.cn' );
$taabao->setUrl( 'www.taabao.com' );
$google-> setUrl( 'www.google.com' );
// メンバー関數(shù)を呼び出してタイトルと URL を取得します
$php->getTitle();
$taabao->getTitle();
$google-> ;getTitle() ;
$php->getUrl();
$taabao->getUrl();
$google->getUrl();
上記で學(xué)んだコードを組み合わせます:
完全なコードは次のとおりです:
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 class Site { /* 成員變量 */ var $url; var $title; /* 成員函數(shù) */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url ."<br/>"; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title . "<br/>"; } } $php = new Site; $taobao = new Site; $google = new Site; // 調(diào)用成員函數(shù),設(shè)置標(biāo)題和URL $php->setTitle( "php中文網(wǎng)" ); $taobao->setTitle( "淘寶" ); $google->setTitle( "Google 搜索" ); $php->setUrl( 'ipnx.cn' ); $taobao->setUrl( 'www.taobao.com' ); $google->setUrl( 'www.google.com' ); // 調(diào)用成員函數(shù),獲取標(biāo)題和URL $php->getTitle(); $taobao->getTitle(); $google->getTitle(); $php->getUrl(); $taobao->getUrl(); $google->getUrl(); ?>
プログラムの実行結(jié)果:
php 中國のウェブサイト
タオバオ
Google検索
ipnx.cn
www.タオバオ。 com
www .google .com
PHP コンストラクター
コンストラクターは特別なメソッドです。これは主に、オブジェクトの作成時(shí)にオブジェクトを初期化する、つまりオブジェクトのメンバー変數(shù)に初期値を割り當(dāng)てるために使用され、オブジェクトを作成するステートメント內(nèi)で常に new 演算子と一緒に使用されます。
PHP 5 では、開発者がクラス內(nèi)のコンストラクターとしてメソッドを定義できます。構(gòu)文形式は次のとおりです。
void __construct ([mixed $args [, $... ]] )
上記の例では、コンストラクター メソッドを通じて $url 変數(shù)と $title 変數(shù)を初期化できます。
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
これで、setTitle メソッドと setUrl メソッドを呼び出す必要がなくなりました:
Instance
コンストラクターを使用して上記のコードを簡素化します:
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 class Site { /* 成員變量 */ var $url; var $title; /* 成員函數(shù) */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url ."<br/>"; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title . "<br/>"; } function __construct( $par1, $par2 ) { $this->url = $par1; $this->title = $par2; } } // 調(diào)用成員函數(shù),設(shè)置標(biāo)題和URL $php = new Site('ipnx.cn', 'php中文網(wǎng)'); $taobao = new Site('www.taobao.com', '淘寶'); $google = new Site('www.google.com', 'Google 搜索'); // 調(diào)用成員函數(shù),獲取標(biāo)題和URL $php->getTitle(); $taobao->getTitle(); $google->getTitle(); $php->getUrl(); $taobao->getUrl(); $google->getUrl(); ?>
プログラムの実行結(jié)果:
php 中國のウェブサイト
タオバオ
Google検索
ipnx.cn
www.taabao.com
www.google.com
Destructor
Destructor (デストラクター) コンストラクターとは対照的に、オブジェクトがライフサイクルを終了するとき (たとえば、オブジェクトが配置されている関數(shù)が呼び出されたとき)、システムは自動(dòng)的に破壊機(jī)能を?qū)g行します。
PHP 5 では、他のオブジェクト指向言語と同様のデストラクターの概念が導(dǎo)入されました。その構(gòu)文形式は次のとおりです。
プログラムの実行結(jié)果:コンストラクター Destroy MyDestructableClass
Inherit
PHP は、キーワード extends を使用してクラスを継承します。形式は次のとおりです。class Child extends Parent {
// コードpart
}
上記は、Child クラスが Parent クラスを継承することを意味します
例
次の例では、Child_Site クラスが Site クラスを継承し、機(jī)能を拡張します。
メソッドの書き換え親クラスから継承したメソッドがサブクラスのニーズを満たせない場合、メソッドを書き換えることができます。このプロセスはメソッドのオーバーライドと呼ばれ、メソッドの書き換えとも呼ばれます。
次の例では、getUrl メソッドと getTitle メソッドを書き換えます。 function getUrl() {
echo $this->url . PHP_EOL;
return $this->url;
}
function getTitle(){
echo $this->EOL;
return $this ->title;
}
アクセス制御
屬性またはメソッドの PHP アクセス制御は、キーワード public (パブリック)、protected (保護(hù)された)、または private (プライベート) を?qū)g現(xiàn)の前に追加することによって行われます。
· public: public クラスのメンバーにはどこからでもアクセスできます。
· protected: 保護(hù)されたクラスのメンバーは、それ自體、そのサブクラス、親クラスからアクセスできます。
? private: プライベート クラスのメンバーには、それが定義されているクラスからのみアクセスできます。
屬性のアクセス制御
クラス屬性は、public、protected、および private のいずれかとして定義する必要があります。 var で定義されている場合は、パブリックとみなされます。
インスタンス
<?php header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼 class MyDestructableClass { function __construct() { print "構(gòu)造函數(shù)\n"; $this->name = "MyDestructableClass"; } function __destruct() { print "銷毀 " . $this->name . "\n"; } } $obj = new MyDestructableClass(); ?>
上記のコードをよく見てください
メソッドのアクセス制御
クラス內(nèi)のメソッドは、パブリック、プライベート、または保護(hù)として定義できます。これらのキーワードが設(shè)定されていない場合、メソッドはデフォルトで public になります。
インスタンス
<?php // 子類擴(kuò)展站點(diǎn)類別 class Child_Site extends Site { var $category; function setCate($par){ $this->category = $par; } function getCate(){ echo $this->category . "<br/>"; } } ?>
インターフェース
インターフェースを使用すると、クラスが実裝する必要があるメソッドを指定できますが、これらのメソッドの具體的な內(nèi)容を定義する必要はありません。
インターフェースは、標(biāo)準(zhǔn)クラスを定義するのと同じように、interface キーワードを通じて定義されますが、その中で定義されているメソッドはすべて空です。
インターフェースで定義されるすべてのメソッドはパブリックである必要があります。これはインターフェースの特性です。
インターフェースを?qū)g裝するには、implements 演算子を使用します。クラスは、インターフェイスで定義されているすべてのメソッドを?qū)g裝する必要があります。実裝しない場合は、致命的なエラーが報(bào)告されます。クラスは複數(shù)のインターフェイスを?qū)g裝できます。複數(shù)のインターフェイスの名前を區(qū)切るにはカンマを使用します。
インスタンス
<?php /** * Define MyClass */ class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // 這行能被正常執(zhí)行 echo $obj->protected; // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤 echo $obj->private; // 這行也會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤 $obj->printHello(); // 輸出 Public、Protected 和 Private /** * Define MyClass2 */ class MyClass2 extends MyClass { // 可以對(duì) public 和 protected 進(jìn)行重定義,但 private 而不能 protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj2->public; // 這行能被正常執(zhí)行 echo $obj2->private; // 未定義 private echo $obj2->protected; // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤 $obj2->printHello(); // 輸出 Public、Protected2 和 Undefined ?>
定數(shù)
クラス內(nèi)で変更されない値を定數(shù)として定義できます。定數(shù)を定義および使用するときに $ 記號(hào)を使用する必要はありません。
定數(shù)の値は固定値である必要があり、変數(shù)、クラス屬性、數(shù)學(xué)的演算や関數(shù)呼び出しの結(jié)果にすることはできません。
PHP 5.3.0 以降、変數(shù)を使用してクラスを動(dòng)的に呼び出すことができます。ただし、この変數(shù)の値をキーワード (self、parent、static など) にすることはできません。
インスタンス
<?php /** * Define MyClass */ class MyClass { // 聲明一個(gè)公有的構(gòu)造函數(shù) public function __construct() { } // 聲明一個(gè)公有的方法 public function MyPublic() { } // 聲明一個(gè)受保護(hù)的方法 protected function MyProtected() { } // 聲明一個(gè)私有的方法 private function MyPrivate() { } // 此方法為公有 function Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); } } $myclass = new MyClass; $myclass->MyPublic(); // 這行能被正常執(zhí)行 $myclass->MyProtected(); // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤 $myclass->MyPrivate(); // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤 $myclass->Foo(); // 公有,受保護(hù),私有都可以執(zhí)行 /** * Define MyClass2 */ class MyClass2 extends MyClass { // 此方法為公有 function Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤 } } $myclass2 = new MyClass2; $myclass2->MyPublic(); // 這行能被正常執(zhí)行 $myclass2->Foo2(); // 公有的和受保護(hù)的都可執(zhí)行,但私有的不行 class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic\n"; } private function testPrivate() { echo "Foo::testPrivate\n"; } } $myFoo = new foo(); $myFoo->test(); // Bar::testPrivate // Foo::testPublic ?>
抽象クラス
どのクラスでも、その中の少なくとも 1 つのメソッドが抽象として宣言されている場合、このクラスは抽象として宣言されなければなりません。
抽象として定義されたクラスはインスタンス化できません。
abstract として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関數(shù)の実裝を定義することはできません。
抽象クラスを継承する場合、サブクラスは親クラス內(nèi)のすべての抽象メソッドを定義する必要があり、さらに、これらのメソッドのアクセス制御は親クラスと同じ (またはより緩和された) ものでなければなりません。たとえば、抽象メソッドが protected として宣言されている場合、サブクラスに実裝されているメソッドは protected または public として宣言する必要があり、private として定義することはできません。さらに、メソッドを呼び出すメソッドは一致している必要があります。つまり、必要なパラメータの型と數(shù)が一致している必要があります。たとえば、サブクラスがオプションのパラメーター
を定義しているが、それが親クラスの抽象メソッドの宣言に含まれていない場合、2 つの宣言の間に競合はありません。
インスタンス
<?php
// 聲明一個(gè)'iTemplate'接口
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// 實(shí)現(xiàn)接口
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
?>
プログラムの実行結(jié)果:
static キーワード
は、クラスの屬性またはメソッドを static (static) として宣言します。クラスをインスタンス化せずに直接アクセスできます。-> 演算子を使用してオブジェクトから靜的プロパティにアクセスすることはできません。
インスタンス化されたクラスのオブジェクトを通じて靜的プロパティにアクセスすることはできません (ただし、靜的メソッドはアクセスできます)。
靜的メソッドではオブジェクトを呼び出す必要がないため、疑似変數(shù) $this は靜的メソッドでは使用できません。
PHP 5.3.0 以降、変數(shù)を使用してクラスを動(dòng)的に呼び出すことができます。ただし、この変數(shù)の値をキーワード self、parent、または static にすることはできません。 インスタンス
<?php class MyClass { const constant = '常量值'; function showConstant() { echo self::constant . "<br/>"; } } echo MyClass::constant . "<br/>"; $classname = "MyClass"; echo $classname::constant . "<br/>"; // 自 5.3.0 起 $class = new MyClass(); $class->showConstant(); echo $class::constant . "<br/>"; // 自 PHP 5.3.0 起 ?>
プログラム実行結(jié)果:
foofoo
最後のキーワード
PHP 5 では、新しい Final キーワードが追加されています。親クラスのメソッドがfinalと宣言されている場合、子クラスはそのメソッドをオーバーライドできません。クラスがfinalと宣言されている場合、そのクラスを継承することはできません。代 例
次のコードを?qū)g行するとエラーが報(bào)告されます: <?php
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . "<br/>";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . "<br/>";
?>
プログラム実行結(jié)果:
親クラスのコンストラクターを呼び出す
PHP は、サブクラスのコンストラクターで親クラスのコンストラクターを自動(dòng)的に呼び出しません。親クラスのコンストラクターを?qū)g行するには、サブクラスのコンストラクター內(nèi)でparent::__construct()
instance
<?php
class Foo {
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
print Foo::$my_static . "<br/>";
$foo = new Foo();
print $foo->staticValue() . "<br/>";
?>
を呼び出す必要があります。 SubClassクラスのConstructorメソッド BaseClassクラスのConstructorメソッドBaseClass クラス