ホームページ  >  記事  >  バックエンド開発  >  PHPオブジェクト指向プログラミング学習メモ_PHPチュートリアル

PHPオブジェクト指向プログラミング学習メモ_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:15:07722ブラウズ

オブジェクト指向プログラミングは、PHP で一般的に使用される方法であり、この記事では、PHP オブジェクト指向を使用する簡単な方法と、必要な基礎知識を紹介します。

(OOP) を開発します。オブジェクト指向開発には、プロセス指向開発に比べて多くの利点があります:
簡単なメンテナンス モジュール性はオブジェクト指向プログラミングの機能です。エンティティはクラスとして表され、同じ名前空間内の同じ機能を持つクラスとして表されるため、名前空間の他のメンバーに影響を与えることなく名前空間にクラスを追加できます。
拡張性 オブジェクト指向プログラミングは本質的に拡張性をサポートしています。特定の機能を備えたクラスがある場合、そのクラスを簡単に拡張して、拡張機能を備えたクラスを作成できます。
コードの再利用 機能はクラスにカプセル化されており、クラスは独立したエンティティとして存在するため、クラス ライブラリの提供は非常に簡単です。
複数の人が協力してプロジェクトを開発する方が適しているため、多くの大規模および中規模の Web サイトが開発に OOP を選択するようになりました。

それではオブジェクト指向プログラミングを紹介しましょう

プロパティとメソッドを含むクラス

PHP におけるクラス構文形式の定義:

コードは次のとおりです コードをコピー
class クラス名 [オプションの属性]{
public $property [=value];… // public を使用してパブリック識別子を宣言し、変数に値を割り当てることもできます
。 function functionname (args){ //クラスメソッドのメンバー関数
コード}…
//クラスメソッド(メンバー関数)
}

オブジェクトの生成(クラスのインスタンス化): $object name=new classname( );
オブジェクトのプロパティの使用

クラスでは、特別なポインター $this にアクセスできます。クラス内の操作を通じて変数を設定またはアクセスするときは、$this->name を使用して参照します。

コードは次のとおりです コードをコピー

クラスの人{
関数 _ _destruct( )
{ エコー「バイバイ!」 }
; }
$a=新しい人();


1.決勝
Final: php5 は新しい Final キーワードを追加します。親クラスのメソッドがfinalと宣言されている場合、サブクラスはそのメソッドをオーバーライドできません。クラスがfinalと宣言されている場合、そのメソッドは継承できません。

コードは次のとおりです コードをコピー

クラスBaseClass{
パブリック関数テスト(){
ehco "テスト";
}

最終公開関数 moreTest(){
echo "moretest";
}
}

class ChildClass は BaseClass を拡張します{
パブリック関数 moreTest(){
echo "moretest";
}
}
// 致命的なエラーを生成します: 最終メソッド BaseClass::moretest() をオーバーライドできません


2.__toString (PHP5.2 以降の使用を推奨)

コードは次のとおりです コードをコピー
クラスの人{
protected $name;
protected $email;

パブリック関数 setName($name){
$this->name = $name;
}

パブリック関数 setEmail($email){
$this->email = $email;
}

パブリック関数 __toString(){
return "$this->名前 <$this->メールアドレス>";
}
}
$rasums = 新しい人;
$rasums->setName('test');
$rasums->setEmail('test@qq.com');
$rasums を印刷します;



3.インターフェースと抽象クラス

インターフェイスの役割: クラスが特定の名前、可視性、およびプロトタイプを持つ 1 つ以上のメソッドを実装していることを確認したいと考えています。
インターフェース要件:
クラス内のすべてのメソッドは抽象メソッドです
抽象メソッドに抽象を追加する必要はありません
インターフェースの抽象メソッド属性は public です
メンバー属性は定数である必要があります
例:

コードは次のとおりです コードをコピー
インターフェース ChildTest{
パブリック関数 childTest();
}
クラス FathTest は ChildTest1,ChildTest2{
を実装します パブリック関数 childTest(){
エコー 1;
}
…………
}


抽象化の役割: 実際、抽象クラスとインターフェイス クラスは部分的に似ています。抽象クラスはクラス イメージの一部を抽出するという文をどこかで見た記憶があります。この文は一見滑稽に見えますが、実際には抽象クラスの真実を語っています。抽象クラスの役割は、クラスの多くが常に繰り返し記述している多くのメソッドを使用していることがわかった場合に、抽象クラスの使用を検討できることです。「クラスのすべてのパブリック関数を書き直すことはできない。 「このパブリック クラスをインスタンス化し、同じメソッドを呼び出します。」 これで問題ありません。実際、これは抽象クラスの動作ですが、インスタンス化のステップが省略され、次のようにすることができます。このクラス メソッドを直接呼び出すことも、このメソッドをオーバーロードすることもできます。
抽象的な要件:
クラスには少なくとも 1 つの抽象メソッドが必要です
抽象メソッドはabstractで追加する必要があります
例:

コードは次のとおりです コードをコピー
抽象クラス データベース{
抽象パブリック関数 connect();
抽象パブリック関数 query();
抽象パブリック関数 fetch();
抽象パブリック関数 close();
}

注: 抽象メソッドは継承する必要があるため、プライベート メソッドまたは Final メソッドとして定義できません。

4. オブジェクト参照を渡す
php4: すべての「=」はコピーを作成します
php5: オブジェクトを除き、他の "=" に値を代入すると、オブジェクトが参照である間にコピーが作成されます。
5. オブジェクトのクローンを作成します
1.
集約クラス:
__call メソッドの概要:
__call は、クライアント コードがクラスで定義されていないメソッドを使用するときに呼び出されます。
__call() は 2 つのパラメータを受け入れます。1 つはメソッド名で、もう 1 つは呼び出されるメソッドに渡されるすべてのパラメータ (配列を含む) です
__call() メソッドによって返される値は、呼び出し元のメソッドが実際に存在するかのようにクライアントに返されます
例:

コードは次のとおりですコードをコピー



6. 重要な属性アクセス (__set __get __isset __unset) __isset __unset は 5.1 以降でのみ役立ちます
機能: 属性の要求をインターセプトするため、分離の度合いを向上させるために、 isset を使用して属性を検出したり、 unset() を使用して属性を削除したりするときに、 __isset() と __unset() も実装する必要があります。クラスの振る舞いは正しい
例:

クラスアドレス{

保護された $city;
保護された $country;

パブリック関数 setCity($city){$this->city = $city;}

パブリック関数 getCity(){return $this->city;}
パブリック関数 set Country($country){$this->country = $country;}
パブリック関数 get Country(){return $this->country;}
}

クラスの人{

protected $name;
protected $address;
//浅いクローン
パブリック関数 __construct(){
$this->address = 新しいアドレス;
}

パブリック関数 setName($name){

$this->name = $name;
}
パブリック関数 getName(){
return $this->name;
}

パブリック関数 __call($method,$arguments){

If(method_exists($this->アドレス,$method)){
return call_user_func_array(array($this->address,$method),$arguments);
}
}
//ディープクローン
パブリック関数 __clone(){
$this->address = クローン $this->address;
}
}

$test1 = 新しい人;

$test2 = $test1 のクローンを作成します;

$test1->setName('testname1');

$test1->setCity('testcity1');
$test2->setName('testname2');
$test2->setCity('testcity2');

echo $test1->getName().'-'.$test1->getCity()."n";

echo $test2->getName().'-'.$test2->getCity()."n";
//テスト名1-テストシティ2
//テスト名2-テストシティ2

コードは次のとおりです コードをコピー

クラスの人{
protected $__data = array('email','test');

パブリック関数 __get($property){
If(isset($this->__data[$property])){
return $this->__data[$property];
}その他{
falseを返す;
}
}

パブリック関数 __set($property,$value){
If(isset($this->__data[$property])){
return $this->__data[$property] = $value;
}その他{
falseを返す;
}
}

パブリック関数 __isset($property){
If(isset($this->__data[$property])){
true を返す;
}その他{
falseを返す;
}
}

パブリック関数 __unset($property){
If(isset($this->__data[$property])){
return unset($this->__data[$property]);
}その他{
falseを返す;
}
}
}

$test = 新しい人;
$test->email= 'テスト';
var_dump($test->email);

注:

これら 2 つのメソッドは、欠落している属性のみをキャプチャします。クラスの属性を定義すると、php はこの属性にアクセスするときに __get() と __set() を呼び出しません。 これら 2 つの方法は、プロパティ継承の概念を完全に破壊します。親オブジェクトに __get() メソッドがあり、サブクラスに独自の __get() メソッドを実装した場合、親クラスの __get() メソッドは呼び出されないため、オブジェクトは正しく実行されません。それはparent::__get()で解決できます

短所:

速度は比較的遅いです

マジック アクセサー メソッドを使用すると、phpdocumentor などのツールでコードを自動的に文書化できます
静的プロパティでは使用できません

http://www.bkjia.com/PHPjc/628862.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/628862.html技術記事オブジェクト指向プログラミングは、PHP でよく使用される手法であり、PHP オブジェクト指向を使用する簡単な方法と、必要な基礎知識を紹介します。 (OOP) 発展する...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。