PHP オブジェクト指向
オブジェクト指向プログラミング(英語: Object- Oriented Programming、略稱: OOP)において、オブジェクトとは、情報(bào)とその情報(bào)を処理する方法の記述から構(gòu)成される全體であり、現(xiàn)実世界を抽象化したものです。 OOP は、再利用性、柔軟性、拡張性というソフトウェア エンジニアリングの 3 つの目標(biāo)を達(dá)成します。
PHP はバージョン 4.0 以降、OOP のサポートを改善しました。小規(guī)模なアプリケーションの場合は、従來の手続き型プログラミングを使用する方が簡単で効率的である場合があります。 ただし、大規(guī)模で複雑なアプリケーションの場合は、OOP を考慮する必要があります。
クラス
クラスは、同じプロパティとサービスを持つオブジェクトのコレクションです。これは、このクラスに屬するすべてのオブジェクトに対して統(tǒng)一された抽象的な説明を提供します。これには、プロパティとサービスという 2 つの主要な部分が含まれます。 オブジェクト指向プログラミング言語では、クラスは獨(dú)立したプログラム単位であり、クラス名を持ち、屬性の説明とサービスの説明という 2 つの主要な部分を含む必要があります。
オブジェクト
オブジェクトとは、システム內(nèi)の客観的なものを記述するために使用される実體であり、システムを構(gòu)成する基本単位です。オブジェクトは、プロパティのセットと、プロパティのセットに対して動作するサービスのセットで構(gòu)成されます。
現(xiàn)実の世界で私たちが直面しているのは、コンピューター、テレビ、自転車などの物體です。
オブジェクトの主な 3 つの特性:
オブジェクトの動作: オブジェクトにどのような操作を適用できるか、ライトをオンにするかライトをオフにするかが動作です。
オブジェクトの形狀: メソッドが適用されたときのオブジェクトの反応、色、サイズ、外観。
オブジェクトの表現(xiàn): オブジェクトの表現(xiàn)は、同じ動作や狀態(tài)の違いを明確に區(qū)別するものです。
クラスとオブジェクトの関係
クラスとオブジェクトの関係は、型と鋳造の関係に似ており、クラスのインスタンス化の結(jié)果がオブジェクトであり、オブジェクトの型を抽象化したものがクラスです。
たとえば、Animal は犬と羊を指定できる抽象クラスであり、犬と羊は色の屬性を持ち、書き込み、実行、その他の動作狀態(tài)を持ちます。
オブジェクト指向コンテンツ
クラス - 物の抽象的な特性を定義します。クラスの定義には、データの形式とデータに対する操作が含まれます。
Object -クラスのインスタンスです。
メンバー変數(shù)-クラス內(nèi)で定義された変數(shù)。この変數(shù)の値は外部には見えませんが、クラスがオブジェクトとしてインスタンス化された後は、その変數(shù)をオブジェクトの屬性と呼ぶことができます。
メンバー関數(shù) - クラス內(nèi)で定義され、オブジェクトのデータにアクセスするために使用できます。
継承-継承は、サブクラスが親クラスのデータ構(gòu)造とメソッドを自動的に共有するメカニズムです。これはクラス間の関係です。クラスを定義して実裝するときは、既存のクラスに基づいて実行したり、既存のクラスによって定義されたコンテンツを獨(dú)自のコンテンツとして取得したり、新しいコンテンツを追加したりできます。
親クラス-クラスは他のクラスによって継承されます。このクラスは、親クラス、基本クラス、またはスーパークラスと呼ばれます。
サブクラス-他のクラスを継承するクラスはサブクラスと呼ばれ、または派生クラスと呼ばれることもあります。
ポリモーフィズム-ポリモーフィズムとは、同じ操作、関數(shù)、またはプロセスを複數(shù)の種類のオブジェクトに適用して、異なる結(jié)果を得ることができることを意味します。同じメッセージを受信したときに、オブジェクトが異なれば結(jié)果も異なる場合があります。この現(xiàn)象はポリモーフィズムと呼ばれます。
オーバーロード-簡単に言うと、関數(shù)またはメソッドの名前は同じですが、パラメーターリストが異なるこのような関數(shù)またはメソッドは、オーバーロードされた関數(shù)またはメソッドと呼ばれます。
抽象化-抽象化は、一貫したデータ構(gòu)造(屬性)と動作(操作)を持つオブジェクトをクラスに抽象化することを指します。クラスは、アプリケーションに関連する重要なプロパティを反映し、その他の無関係なコンテンツを無視する抽象化です。クラスの分割は主観的ですが、特定のアプリケーションに関連している必要があります。
カプセル化-カプセル化とは、現(xiàn)実世界に存在するオブジェクトの屬性と動作をバインドし、論理ユニットに配置することを指します。
コンストラクター-主に、オブジェクトの作成時にオブジェクトを初期化するために使用されます。つまり、オブジェクトを作成するステートメントで常に new 演算子と一緒に使用されます。
Destructor ? デストラクター (デストラクター) コンストラクターとは対照的に、オブジェクトがそのライフサイクルを終了するとき (たとえば、オブジェクトが配置されている関數(shù)が呼び出されたとき)、システムは自動的にデストラクターを?qū)g行します。デストラクターは、「クリーンアップ」作業(yè)を行うためによく使用されます (たとえば、オブジェクトを作成するとき、new を使用してメモリー空間を開きます。このメモリー空間は、終了する前にデストラクターの delete で解放する必要があります)。
下の図では、Car クラスを通じて Mercedes、Bmw、Audi の 3 つのオブジェクトを作成しました。
$mercedes = new Car ();
$bmw = new Car ();
キーワードclassを使用して宣言しますクラス、クラス名、{} 記號で囲まれた本體。 構(gòu)文:
class class_name{...
}
クラスには屬性とメソッドが含まれます。
クラス定義でキーワード var を使用して変數(shù)を宣言することにより、クラスのメンバー屬性とも呼ばれるクラスの屬性を作成します。
構(gòu)文:
class class_name{var $var_name;
}
クラス定義で関數(shù)を宣言することで、クラスのメソッドが作成されます。
文法:
class class_name{
function function_name(arg1,arg2,...)
{
関數(shù)コード
}
}
屬性とメソッドを定義するクラスは完全なクラスであり、クラス內(nèi)に含めることができます。完全な処理ロジック。 new キーワードを使用してオブジェクトをインスタンス化し、クラス內(nèi)にロジックを適用します。複數(shù)のオブジェクトを同時にインスタンス化できます。
構(gòu)文:
object = new class_name();
オブジェクトをインスタンス化した後、-> 演算子を使用してオブジェクトのメンバー プロパティとメソッドにアクセスします。
構(gòu)文:
object->var_name;
object->function_name;
定義されたクラスのメンバーの屬性またはメソッドにアクセスしたい場合は、疑似変數(shù) $this を使用できます。 $this は、現(xiàn)在のオブジェクトまたはオブジェクト自體を表すために使用されます。
<?php class Person { //人的成員屬性 var $name; //人的名字 var $age; //人的年齡 //人的成員 say() 方法 function say() { echo "我的名字叫:".$this->name." <br >"; echo "我的年齡是:".$this->age; } } //類定義結(jié)束 //實(shí)例化一個對象 $p1 = new Person(); //給 $p1 對象屬性賦值 $p1->name = "張三"; $p1->age = 20; //調(diào)用對象中的 say()方法 $p1->say(); ?>
この例を?qū)g行すると、出力は次のようになります:
私の名前: Zhang San
私の年齢: 20
Example
<?php class Site { /* 成員變量 */ var $url; var $title; /* 成員函數(shù) */ function setUrl($par) { $this->url = $par; } function getUrl() { echo $this->url . PHP_EOL; } function setTitle($par) { $this->title = $par; } function getTitle() { echo $this->title . PHP_EOL; } } $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(); ?>
例を?qū)g行します?
上記のコードを?qū)g行すると、出力は次のようになります:
php 中國のウェブサイト
淘寶網(wǎng)
Google 検索
ipnx.cn
www.taabao.com
www.google.com
PHP コンストラクター
コンストラクターは特別なメソッドです。これは主に、オブジェクトの作成時にオブジェクトを初期化する、つまりオブジェクトのメンバー変數(shù)に初期値を割り當(dāng)てるために使用され、オブジェクトを作成するステートメント內(nèi)で常に new 演算子と一緒に使用されます。 new 演算子を使用してクラスのインスタンスを作成する場合、コンストラクターは自動的に呼び出され、その名前は __construct() である必要があります
クラス內(nèi)で宣言できるコンストラクターは 1 つだけであり、オブジェクトが作成されるたびにのみ呼び出されます。コンストラクターが呼び出されると、このメソッドをアクティブに呼び出すことはできないため、通常はいくつかの便利な初期化タスクを?qū)g行するために使用されます。このメソッドには戻り値がありません。
構(gòu)文:
function __construct(arg1,arg2,...)
{
...
}
上記の例では、コンストラクター メソッドの title 変數(shù)を通じて $url と $ を初期化できます。
<?php
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
これで、setTitle メソッドと setUrl メソッドを呼び出す必要がなくなりました。
Instance
<?php $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(); ?>
実行中のインスタンス?
Destructorコンストラクターに対応するのはデストラクター メソッドであり、デストラクター メソッドを使用すると、クラスの前に実行される一部の操作を Destroy できます。または、ファイルを閉じる、結(jié)果セットを解放するなど、いくつかの機(jī)能を完了します。デストラクターはパラメーターを取ることができず、その名前は __destruct() でなければなりません。 PHP 5 では、他のオブジェクト指向言語と同様のデストラクターの概念が導(dǎo)入されました。その構(gòu)文形式は次のとおりです:
function __destruct(){
...}
Example
<?php class MyDestructableClass { function __construct() { print "構(gòu)造函數(shù)\n"; $this->name = "MyDestructableClass"; } function __destruct() { print "銷毀 " . $this->name . "\n"; } } $obj = new MyDestructableClass(); ?>
上記のコードを?qū)g行すると、出力結(jié)果は次のようになります:
コンストラクター
Destroy MyDestructableClass
コンストラクターとデストラクターは同時に使用されます
<?php class Person { var $name; var $age; //定義一個構(gòu)造方法初始化賦值 function __construct($name,$age) { $this->name=$name; $this->age=$age; } function say() { echo "我的名字叫:".$this->name." <br >"; echo "我的年齡是:".$this->age." <br >";; } function __destruct() { echo "再見".$this->name; } } $p1=new Person("張三", 20); $p1->say(); ?>
で上記のコードを?qū)g行すると、出力結(jié)果は次のようになります:
私の名前: Zhang San
私の年齢: 20
さようなら、Zhang San
継承
PHP クラスの継承とは、以前に定義された 1 つ以上のクラスからデータとメソッドを継承する新しい派生クラスを作成することを指し、新しいデータとメソッドを再定義または追加することで、クラスの階層またはレベルを確立できます。
新しいクラスの派生に使用される既存のクラスを親クラスと呼び、既存のクラスから派生した新しいクラスをサブクラスと呼びます。継承はオブジェクト指向の 3 つの主要な特徴の 1 つです。
継承メカニズムを通じて、既存のデータ型を使用して新しいデータ型を定義できます。定義された新しいデータ型には、新しく定義されたメンバーだけでなく、古いメンバーも含まれます。
注: Java などの言語とは異なり、PHP では、クラスは 1 つのクラスからのみデータを直接継承できます (単一継承)。
extends キーワードを使用してクラスの継承を定義します:
class subclass extendsparent class {
}
Instance
インスタンスでは、Child_Site クラスが Site クラスを継承し、機(jī)能を拡張します:
<?php // 子類擴(kuò)展站點(diǎn)類別 class Child_Site extends Site { var $category; function setCate($par){ $this->category = $par; } function getCate(){ echo $this->category . PHP_EOL; } } ?>
メソッドヘビーライト
親クラスから継承されたメソッドがサブクラスのニーズを満たせない場合、メソッドを書き換えることができます。このプロセスはメソッドオーバーライドと呼ばれ、メソッドの書き換えとも呼ばれます。
getUrl メソッドと getTitle メソッドはインスタンス內(nèi)で書き換えられます。
echo $this->title . PHP_EOL;return $this->title }
PHP では、アクセス修飾子 public、protected、または private を追加します。 infront プロパティまたはメソッドへのアクセス制御を?qū)g裝します。
型のアクセス修飾子を使用すると、開発者はクラス メンバーへのアクセスを制御できます。これは OOP 言語の機(jī)能です。
PHP は次の 3 つのアクセス修飾子をサポートしています:
public (パブリック): クラス內(nèi)のメンバーにはアクセス制限がなく、すべての外部メンバーがこのクラス メンバー (メンバー プロパティとメンバー メソッドを含む) にアクセス (読み取りおよび書き込み) できます。クラスのメンバーがメンバー アクセス修飾子を指定しない場合、そのメンバーはパブリックとして扱われます。 protected (保護(hù)された): protected として定義されたメンバーには、クラスの外部コードからアクセスできませんが、クラスのサブクラスにはアクセス権があります。
private (プライベート): プライベートとして定義されたメンバーは、同じクラス內(nèi)のすべてのメンバーへのアクセスを許可しますが、外部コードおよびクラスのサブクラスへのアクセスは許可されません。
モディファイアのアクセス権限の比較表:
? √外部メンバー全員
ヒント: サブクラスが親クラスのメソッドをオーバーライドする場合、サブクラスは、クラス內(nèi)のメソッドのアクセス許可を、親クラスのオーバーライドされたメソッドのアクセス許可より低くすることはできません。クラス。
屬性のアクセス制御クラス屬性は、public、protected、および private のいずれかとして定義する必要があります。 var で定義されている場合は、パブリックとみなされます。
<?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 ?>メソッドのアクセス制御クラス內(nèi)のメソッドは、パブリック、プライベート、または保護(hù)として定義できます。これらのキーワードが設(shè)定されていない場合、メソッドはデフォルトで public になります。
<?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 ?>カプセル化カプセル化とは、クラス(オブジェクト)の屬性とサービスを獨(dú)立した単位に結(jié)合し、內(nèi)部の詳細(xì)を可能な限り隠し、外部との通信に必要なインターフェイスのみを殘すことです。このカプセル化機(jī)能により、オブジェクトの獨(dú)立性が効果的に確保され、ソフトウェア エラーの位置特定が可能になり、エラー チェックとトラブルシューティングの難しさが大幅に軽減されます。 private キーワードを使用してプロパティとメソッドをカプセル化します。
<?php class Person { //將成員屬性定義為 private private $name; private $age; //定義一個構(gòu)造方法初始化賦值 function __construct($name, $age) { $this->name=$name; $this->age=$age; } function say() { echo "我的名字叫:".$this->name." <br >"; echo "我的年齡是:".$this->age; } } $p1=new Person("張三", 20); $p1->say(); ?>
Interface
PHP クラスは単一継承です。つまり、クラスが複數(shù)のクラスの関數(shù)を必要とする場合、継承は無力です。このため、PHP ではクラス インターフェイス テクノロジが導(dǎo)入されました。
抽象クラス內(nèi)のすべてのメソッドが抽象メソッドであり、変數(shù)が宣言されておらず、インターフェイス內(nèi)のすべてのメンバーがパブリック権限を持っている場合、この特別な抽象クラスはインターフェイスと呼ばれます。
インターフェースを使用すると、クラスが実裝する必要があるメソッドを指定できますが、これらのメソッドの特定の內(nèi)容を定義する必要はありません。
インターフェースは、標(biāo)準(zhǔn)クラスを定義するのと同じように、interface キーワードを通じて定義されますが、その中で定義されているメソッドはすべて空です。 インターフェースで定義されるすべてのメソッドはパブリックである必要があります。これはインターフェースの特性です。
<?php //定義接口 interface User{ function getDiscount(); function getUserType(); } //VIP用戶 接口實(shí)現(xiàn) class VipUser implements User{ // VIP 用戶折扣系數(shù) private $discount = 0.8; function getDiscount() { return $this->discount; } function getUserType() { return "VIP用戶"; } } class Goods{ var $price = 100; var $vc; //定義 User 接口類型參數(shù),這時并不知道是什么用戶 function run(User $vc){ $this->vc = $vc; $discount = $this->vc->getDiscount(); $usertype = $this->vc->getUserType(); echo $usertype."商品價格:".$this->price*$discount; } } $display = new Goods(); $display ->run(new VipUser);//可以是更多其他用戶類型 ?>結(jié)果:VIPユーザー製品価格: 80元
PHPはクラスを継承する際に複數(shù)のインターフェースを同時に実裝することもできます:
クラスのサブクラスは、親クラスのimplementtnsインターフェイス1、インターフェイス2、...
{
...
}を拡張します
抽象クラスとインターフェイスの違い
インターフェイスは特別な抽象クラスであるか、次のように考えることができます機(jī)種の仕様として記載しております。インターフェイスと抽象クラスの一般的な違いは次のとおりです。
サブクラスがインターフェイスを?qū)g裝する場合、サブクラスはインターフェイス內(nèi)のすべてのメソッドを (必要かどうかに関係なく) 実裝する必要があります。抽象クラスを継承する場合は、実裝するだけで済みます。必要なメソッド。
インターフェイスで定義されたメソッド名が変更された場合、このインターフェイスを?qū)g裝するすべてのサブクラスはメソッド名を同期的に更新する必要があり、抽象クラスでメソッド名が変更された場合でも、そのサブクラスの対応するメソッド名は影響を受けません。ただし、変更されます (古いメソッドの実裝と比較して) 新しいメソッドになるだけです。
抽象クラスは単一でのみ継承できます。サブクラスが複數(shù)の親クラスから継承する必要がある関數(shù)を?qū)g裝する必要がある場合は、インターフェイスを使用する必要があります。
定數(shù)
通常のdefine()関數(shù)の代わりにconstキーワードを使用して、クラス內(nèi)の定數(shù)を定義します。
クラス內(nèi)で常に変更されない値を定數(shù)として定義できます。定數(shù)を定義および使用するときに $ 記號を使用する必要はありません。
定數(shù)の値は固定値である必要があり、変數(shù)、クラス屬性、數(shù)學(xué)的演算や関數(shù)呼び出しの結(jié)果にすることはできません。
PHP 5.3.0 以降、変數(shù)を使用してクラスを動的に呼び出すことができます。ただし、この変數(shù)の値をキーワード (self、parent、static など) にすることはできません。
構(gòu)文
const constant = "value";
インスタンス:
<?php Class Person{ // 定義常量 const country = "中國"; public function myCountry() { //內(nèi)部訪問常量 echo "我是".self::country."人 <br >"; } } // 輸出常量 echo Person::country." <br >"; // 訪問方法 $p1 = new Person(); $p1 -> myCountry(); ?>
実行出力:
中國
私は中國人です
抽象クラス
クラス內(nèi)の少なくとも 1 つのメソッドが抽象であると宣言されている場合、任意のクラス、その場合、クラスは抽象として宣言する必要があります。
抽象として定義されたクラスはインスタンス化できません。
abstract として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関數(shù)の実裝を定義することはできません。
抽象クラスを継承する場合、サブクラスは親クラスのすべての抽象メソッドを定義する必要があります。また、これらのメソッドのアクセス制御は親クラスと同じ (またはより緩和された) 必要があります。 たとえば、抽象メソッドが protected として宣言されている場合、サブクラスに実裝されているメソッドは protected または public として宣言する必要があり、private として定義することはできません。 さらに、メソッドを呼び出すメソッドは一致している必要があります。つまり、必要なパラメータの型と數(shù)が一致している必要があります。 たとえば、サブクラスが親クラスの抽象メソッドの宣言に含まれていないオプションのパラメーターを定義している場合、2 つの宣言の間に競合はありません。
<?php abstract class AbstractClass { // 強(qiáng)制要求子類定義這些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue() . PHP_EOL; } } 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_') . PHP_EOL; $class2 = new ConcreteClass2; $class2->printOut(); echo $class2->prefixValue('FOO_') . PHP_EOL; ?>
上記のコードを?qū)g行すると、出力結(jié)果は次のようになります:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
Static キーワード
はクラス屬性またはメソッドを static (靜的) として宣言し、クラスをインスタンス化せずに直接アクセスできます。 。
インスタンス化されたクラスのオブジェクトを通じて靜的プロパティにアクセスすることはできません (ただし、靜的メソッドはアクセスできます)。
靜的メソッドではオブジェクトを呼び出す必要がないため、疑似変數(shù) $this は靜的メソッドでは使用できません。
-> 演算子を使用してオブジェクトから靜的プロパティにアクセスすることはできません。
PHP 5.3.0 以降、変數(shù)を使用してクラスを動的に呼び出すことができます。ただし、この変數(shù)の値をキーワード self、parent、または static にすることはできません。
<?php Class Person{ // 定義靜態(tài)成員屬性 public static $country = "中國"; // 定義靜態(tài)成員方法 public static function myCountry() { // 內(nèi)部訪問靜態(tài)成員屬性 echo "我是".self::$country."人<br >"; } } class Student extends Person { function study() { echo "我是". parent::$country."人<br >"; } } // 輸出成員屬性值 echo Person::$country."<br >";// 輸出:中國 $p1 = new Person(); //echo $p1->country;// 錯誤寫法 // 訪問靜態(tài)成員方法 Person::myCountry();// 輸出:我是中國人 // 靜態(tài)方法也可通過對象訪問: $p1->myCountry(); // 子類中輸出成員屬性值 echo Student::$country."<br >";// 輸出:中國 $t1 = new Student(); $t1->study();// 輸出:我是中國人 ?>
実行出力:
中國
私は中國人です
私は中國人です
中國
私は中國人です
最後のキーワード
PHP 5 では、新しい最後のキーワードが追加されています。親クラスのメソッドがfinalと宣言されている場合、子クラスはそのメソッドをオーバーライドできません。クラスがfinalと宣言されている場合、そのクラスを継承することはできません。
final class person
{
...... 親クラスのコンストラクターを自動的に呼び出します。 親クラスのコンストラクターを?qū)g行するには、子クラスのコンストラクターでparent::__construct()を呼び出す必要があります。 <?php
class BaseClass {
public function test() {
echo "BaseClass::test() called" . PHP_EOL;
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called" . PHP_EOL;
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called" . PHP_EOL;
}
}
// 報(bào)錯信息 Fatal error: Cannot override final method BaseClass::moreTesting()
?>
上記のプログラムを?qū)g行すると、出力結(jié)果は次のようになります:
BaseClassクラスのConstructionメソッド
SubClassクラスのConstructionメソッドBaseClassクラスのConstructionメソッド