初心者向けの PHP オブジェクト指向入門
オブジェクト指向とは
オブジェクトは、情報とその情報を処理する方法の記述で構(gòu)成される全體です
オブジェクト指向プログラミングは、OOPと呼ばれます
。現(xiàn)実の社會、私たちが直面しているもの 物とは、コンピューター、カップ、家などのオブジェクトです
オブジェクトの 3 つの主な特徴
1. オブジェクトの動作: オブジェクトにどのような操作を適用できるか、ライトのオン/オフ行動です。
2. オブジェクトの形狀: これらのメソッドが適用されたときのオブジェクトの反応、色、サイズ、外観。
3. オブジェクトの表現(xiàn): オブジェクトの表現(xiàn)は ID カードと同等であり、特に同じ動作とステータスの違いを區(qū)別します
オブジェクト指向コンテンツ
1.クラス: 抽象を定義します。何かの特徴。クラスの定義には、データの形式とデータに対する操作が含まれます
2.オブジェクト: クラスのインスタンスです
3.メンバー変數(shù): クラス內(nèi)で定義された変數(shù)。この変數(shù)の値は外部からは見えませんが、クラスがオブジェクトとしてインスタンス化された後は、その変數(shù)をオブジェクトの屬性と呼ぶことができます
4.メンバー関數(shù): 內(nèi)部で定義されます。オブジェクトのデータにアクセスするために使用できるクラスです
5. 継承 : 継承は、サブクラスが親クラスのデータ構(gòu)造とメソッドを自動的に共有するメカニズムです。これはクラス間の関係です。クラスを定義して実裝するときは、既存のクラスに基づいて実行したり、既存のクラスで定義されたコンテンツを獨自のコンテンツとして使用したり、新しいコンテンツを追加したりすることができます
6. 親クラス: クラスこのクラスは、他のクラスによって継承されます。このクラスは、親クラス、基本クラス、またはスーパークラスと呼ばれます
7.サブクラス: 他のクラスを継承するクラスは、サブクラスと呼ばれたり、派生クラスと呼ばれたりすることもあります
8.ポリモーフィズム: ポリモーフィズムとは、同じ操作、関數(shù)、またはプロセスが複數(shù)の種類のオブジェクトに作用し、異なる結(jié)果が得られることを意味します。同じメッセージを受信した後、異なるオブジェクトが異なる結(jié)果を生成する可能性があります。この現(xiàn)象はポリモーフィズムと呼ばれます
9.オーバーロード: 簡単に言えば、関數(shù)またはメソッドの名前は同じですが、パラメーター リストが異なる狀況です。同じ名前で異なるパラメーターはオーバーロードされた関數(shù)またはメソッドと呼ばれます
10.抽象性: 抽象化とは、同じ名前で異なるパラメーターを持つ関數(shù)またはメソッドがオーバーロードされた関數(shù)またはメソッドと呼ばれ、オブジェクトがクラスに抽象化されることを意味します。クラスは、アプリケーションに関連する重要なプロパティを反映し、その他の無関係なコンテンツを無視する抽象化です。クラスの分割は主観的ですが、特定のアプリケーションに関連している必要があります
11.カプセル化: カプセル化とは、現(xiàn)実世界に存在するオブジェクトのプロパティと動作をバインドし、それを論理的なユニットに配置することを指します
12.Constructor; は、主にオブジェクトの作成時にオブジェクトを初期化するために使用されます。つまり、オブジェクトを作成するステートメント內(nèi)で常に new 演算子と一緒に使用されます。
13.Destructor: デストラクター (デストラクター) コンストラクターとは反対に、オブジェクトがそのライフサイクルを終了するとき (たとえば、オブジェクトが配置されている関數(shù)が呼び出されたとき)、システムは自動的にデストラクターを?qū)g行します。デストラクターは、「クリーンアップ」作業(yè)を行うためによく使用されます (たとえば、オブジェクトを作成するときに、 new を使用してメモリー空間を開きます。このメモリー空間は、終了する前にデストラクター內(nèi)の delete で解放する必要があります)
クラス定義:
1. クラスは、class キーワードに続いてクラス名を使用して定義されます。
2. 変數(shù)とメソッドは、クラス名の後の中括弧 ({}) 內(nèi)で定義できます。
3. クラス変數(shù)は var を使用して宣言され、変數(shù)の初期化も可能です。
4. 関數(shù)の定義は PHP 関數(shù)の定義に似ていますが、この関數(shù)にはクラスとそのインスタンス化されたオブジェクトを通じてのみアクセスできます
<?php class Site { /* 成員變量 */ var $url; var $title; /* 成員函數(shù) */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title; } } //注:變量 $this 代表自身的對象。 ?>
クラスを作成した後、php でオブジェクトを作成します。 new 演算子を使用して、このクラスのオブジェクトをインスタンス化できます$php = new Site;
$taabao = new Site;
$google = new Site;
上記のコードでは 3 つのオブジェクトを作成し、それぞれ3つのオブジェクトは獨立しています
<?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(); ?>
Constructor
Constructorは特別なメソッドです。これは主に、オブジェクトの作成時にオブジェクトを初期化するために使用されます。つまり、オブジェクトを作成するステートメントで常に new 演算子と一緒に使用されます。クラス內(nèi)のメソッドを Constructor として定義する場合、構(gòu)文形式は次のとおりです。 void __construct ([mixed $args [, $... ]] )
Destructor
Destructor (デストラクター) の逆コンストラクター、オブジェクトが終了するとき (たとえば、オブジェクトが配置されている関數(shù)が呼び出されたとき)、システムは自動的にデストラクターを?qū)g行します。
PHP 5 では、他のものと同様のデストラクターの概念が導(dǎo)入されています。オブジェクト指向言語の構(gòu)文形式は次のとおりです。 void __destruct (void)<?php
header("Content-type: text/html; charset=utf-8");//設(shè)置編碼
class MyDestructableClass {
function __construct() {
print "構(gòu)造函數(shù)</br>";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "銷毀 " . $this->name;
}
}
$obj = new MyDestructableClass();
?>
Inherit
PHP は、クラスの継承にキーワード extends を使用します。
class Child extends Parent { <?php
// 子類擴(kuò)展站點類別
class Child_Site extends Site {
var $category;
function setCate($par){
$this->category = $par;
}
function getCate(){
echo $this->category;
}
}
?>
親クラスから継承されたメソッドがサブクラスのニーズを満たせない場合、このプロセスはメソッドのオーバーライドと呼ばれます。メソッド書き換え
<?php function getUrl() { echo $this->url . PHP_EOL; return $this->url; } function getTitle(){ echo $this->title . PHP_EOL; return $this->title; } ?>アクセス制御
public
(public): パブリック クラス メンバーにはどこからでもアクセスできます。protected (protected): 保護(hù)されたクラスのメンバーは、それ自體、そのサブクラス、親クラスからアクセスできます。 private (プライベート): プライベート クラスのメンバーには、それが定義されているクラスからのみアクセスできます。 屬性のアクセス制御 クラス屬性は、public、protected、privateのいずれかとして定義する必要があります。 var で定義されている場合、public とみなされます メソッドのアクセス制御 クラス內(nèi)のメソッドは、public、private、または protected として定義できます。これらのキーワードが設(shè)定されていない場合、メソッドはデフォルトで public Constant クラス內(nèi)で常に変更されない値を定數(shù)として定義できます。定數(shù)を定義および使用するときに $ 記號を使用する必要はありません。 定數(shù)の値は固定値である必要があり、変數(shù)、クラス屬性、數(shù)學(xué)的演算や関數(shù)呼び出しの結(jié)果にすることはできません。 PHP 5.3.0 以降、変數(shù)を使用してクラスを動的に呼び出すことができます。ただし、この変數(shù)の値をキーワード (self、parent、static など) にすることはできません 抽象クラス 任意のクラス、その中の少なくとも 1 つのメソッドが抽象として宣言されている場合、このクラスは次のように宣言されている必要があります抽象的な。 抽象として定義されたクラスはインスタンス化できません。 abstract として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関數(shù)の実裝を定義することはできません。 抽象クラスを継承する場合、サブクラスは親クラスのすべての抽象メソッドを定義する必要があります。また、これらのメソッドのアクセス制御は親クラスと同じ (またはより緩和された) 必要があります。たとえば、抽象メソッドが protected として宣言されている場合、サブクラスに実裝されているメソッドは protected または public として宣言する必要があり、private として定義することはできません。さらに、メソッドを呼び出すメソッドは一致している必要があります。つまり、必要なパラメータの型と數(shù)が一致している必要があります。たとえば、サブクラスがオプションのパラメータを定義しているが、それが親クラスの抽象メソッドの宣言に含まれていない場合、2 つの宣言の間に競合はありません Interface interface を使用すると、特定のクラスがどのメソッドを?qū)g裝するかを指定できますが、これらのメソッドの具體的な內(nèi)容を定義する必要はありません。 インターフェースは、標(biāo)準(zhǔn)クラスを定義するのと同じように、interface キーワードを通じて定義されますが、その中で定義されているメソッドはすべて空です。 インターフェースで定義されるすべてのメソッドはパブリックである必要があります。これはインターフェースの特性です。 インターフェースを?qū)g裝するには、implements 演算子を使用します。クラスは、インターフェイスで定義されているすべてのメソッドを?qū)g裝する必要があります。実裝しない場合は、致命的なエラーが報告されます。クラスは複數(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; // 這行會產(chǎn)生一個致命錯誤
//echo $obj->private; // 這行也會產(chǎn)生一個致命錯誤
$obj->printHello(); // 輸出 Public、Protected 和 Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 可以對 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; // 這行會產(chǎn)生一個致命錯誤
$obj2->printHello(); // 輸出 Public、Protected2 和 Undefined
?>
<?php
/**
* Define MyClass
*/
class MyClass
{
// 聲明一個公有的構(gòu)造函數(shù)
public function __construct() { }
// 聲明一個公有的方法
public function MyPublic() { }
// 聲明一個受保護(hù)的方法
protected function MyProtected() { }
// 聲明一個私有的方法
private function MyPrivate() { }
// 此方法為公有
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // 這行能被正常執(zhí)行
//$myclass->MyProtected(); // 這行會產(chǎn)生一個致命錯誤
//$myclass->MyPrivate(); // 這行會產(chǎn)生一個致命錯誤
$myclass->Foo(); // 公有,受保護(hù),私有都可以執(zhí)行
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 此方法為公有
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
// $this->MyPrivate(); // 這行會產(chǎn)生一個致命錯誤
}
}
$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
?>