ホームページ バックエンド開発 PHPチュートリアル PHP コードのオブジェクト指向の基本 1

PHP コードのオブジェクト指向の基本 1

Jun 23, 2016 pm 01:38 PM

この記事は初心者には適していません。PHP をある程度理解している人は、PHP のオブジェクト指向機能の一部を補足または復習するために読むことができます。


1. オブジェクト指向とは何ですか?

多少は分かっているのですが、開発でしかオブジェクト指向とは何かとしか言えない気がします。言ってるだけ無駄ですが、PHPはWeb開発で使われることが多いので、オブジェクト指向を使わなくても十分に動作します。このインターフェースを見たとき、まず最初にオブジェクトを 1 つずつ作成し、各オブジェクト間の関係を決定し、最終的にそれらを発展させます。

クラスとは何ですか?オブジェクトとは何ですか?

クラスはセットの抽象化です。それはどのセットですか?同様のプロパティと操作を持つオブジェクトのコレクションです。

オブジェクトは、特定のクラスの特定のインスタンスです。

卒業したら、面接官に暗唱するかもしれませんが、今はまだ自分の理解が本の文章と同じくらい下品だと感じていますが、少なくともこの 2 つを表現するのに自分の脳細胞に頼る必要はなくなりました。定義。


2. php のクラス構造

php のクラスもアクセス制御文字であり、属性とメソッドもあります。

class Person {    private $name = "PersonName";    public static $gender = "PersonGender";        public function test(){        echo $this->name, '<br />';    }};
ログイン後にコピー


3. コンストラクター

コンストラクターの名前は __construct です。コンストラクターでは、次の点を強調したいと思います。

1. PHP は他の言語とは異なります。または java) この方法では、サブクラスをインスタンス化するときに親クラスのコンストラクターが自動的に呼び出されます。PHP では、ここで継承が関係するため、最初に継承を確認することができます。

class Person{	public funciton __construct(){		echo 'Person construct<br />';	}};class Teacher extends Person{	public function __construct(){		//parent::__construct();		echo 'Teacher construct<br />';	}};$t1 = new Teacher; //生成Teacher对象
ログイン後にコピー

操作結果:

Teacher コンストラクト

サブクラスの生成時に親クラスの一部のデータを初期化したい場合は、親クラスのコンストラクターを手動で呼び出してコメント行を開く必要があります。


2. クラス内に異なるパラメーターを持つ 2 つのコンストラクターを記述することはできません。

これには php のいくつかの規制が含まれます。他の言語では、次の記述は正しいです:

class Person{	public funciton __construct(){		echo 'Person construct<br />';	}	public function __construct($param){		echo 'Person with param construct<br />';	}};
ログイン後にコピー



しかし、php は弱い言語タイプであるため、これは許可されません。型の制限に非常に敏感で、__call および func_get_args 関数メカニズムを提供するため、次の方法で実装できます:

class Person{	public function __construct(){		$param = func_get_arg(); //获取参数数据		$param_num = func_num_args(); //获取参数个数		if($param_num == 0){		}else if($param_num == 1){			if(is_array($param[0])){				//...			}		}else{			//...		}	}};
ログイン後にコピー



3. デストラクター

ここでデストラクターが使用されます。インスタンス オブジェクトが終了すると、自動的に呼び出される関数は、インスタンスの終了を完全に終了するためにメモリを解放するステートメントを記述することができます。これは、継承関係がある場合、親クラスのデストラクターを手動で呼び出す必要があることと同じです。クラス デストラクターは 1 つだけです。


4. 制御アクセス文字

public: パブリック アクセス文字。このプロパティまたはメソッドは、クラス内、サブクラス内、およびクラス外からアクセスできます。

protected: 保護されたアクセサー。このプロパティまたはメソッドはクラスとそのサブクラス内でのみアクセスでき、クラス外からはアクセスできません。

private: このクラス内でのみアクセスできるプライベート アクセス シンボル。継承したりオーバーロードしたりすることはできません。


5. マジック メソッド __get と __set

これら 2 つのメソッドの機能: 保護されたプロパティとプライベート プロパティにアクセスするためのアクセサー。これにより、検証クラスの外部から受信したデータの安全性と合理性が保証されます。

__set メソッドは 2 つのパラメータを受け取ります。1 つ目は属性名で、2 つ目は割り当てられる新しい値です。

__get メソッドは 1 つのパラメータ、属性名を受け取ります。


1. パブリック属性は、クラス外の属性を変更するためのサービスを提供できます。したがって、パブリック属性の場合、__get および __set プロセスは実行されません。

class D{    public $name = 'D name';    protected $gender = 'male';    private $age = 18;    public function __set($name, $value){        echo '__set<br />';	//if(in_array($name, ['name', 'gender', 'age']))	$this->$name = $value;    }    public function __get($name){        echo '__get<br />';		//if(!in_array($name, ['name', 'gender', 'age'])) return NULL;        return $this->$name;    }};
ログイン後にコピー



运行结果:
ログイン後にコピー
new D name //name为public属性,不会走get和set__set__getnew D gender__set__getnew D age
ログイン後にコピー


2. データ検証機能を追加し、コメントを開いて検証することもできます。

3. 2 つのメソッドにはパブリック アクセスが必要です。そうでないとエラーが発生します。これら 2 つの関数の機能から、パブリック アクセス制御が必要な理由を想像するのは難しくありません。


6. 継承

最後に、継承がなければ、すべてのクラスはゴミになります。 . この継承機能を詳しく見てみましょう。

継承の話はやめましょう。記事の冒頭に継承の小さな例があります。

相続が発生するとどのような問題が起こるのでしょうか?考えてみてください、B が A を継承すると... とても想像できません...

1. コンストラクター、心配しないでください。これは 2 つのクラスのコンストラクターに相当しますが、もあります。したがって、上記のように、必要に応じて親クラスのコンストラクターを手動で呼び出すことができます。

2. 一方向の継承。サブクラスは親クラスから継承できますが、親クラスはサブクラスから機能を継承できません。

3. 重载,一提到php的重载就特别别扭,因为他的重载放到其他语言里叫做重写overwrite,我还是习惯将这个特性说为重写,大家随便。

<1>public重载:

class E{    public $attr1 = 'E attr1 value';    public function oper1(){        echo 'E oper1<br />';        echo 'attr1 value = ', $this->attr1, '<br />';    }};class F extends E{    public $attr1 = 'F attr1 value';    public function oper1(){        //parent::oper1();        echo 'F oper1<br />';        echo 'attr1 value = ', $this->attr1, '<br />';    }};$f = new F;$f->oper1();
ログイン後にコピー

运行结果:

F oper1
attr1 value = F attr1 value


F继承了E并且重写了E的attr1和oper1,因此,在调用oper1时,$this->attr1显示F attr1 value,如果打开注释parent::oper1调用父类的Oper1方法,运行结果如下:

E oper1
attr1 value = F attr1 value //attr1属性已经被子类重写的attr1属性覆盖
F oper1
attr1 value = F attr1 value

可以看出子类重写父类的属性和方法后,会覆盖父类相应的属性和方法。


<2>private重载

class E{    private $attr1 = 'E attr1 value';    public function oper1(){        echo 'E oper1<br />';        echo 'attr1 value = ', $this->attr1, '<br />';    }};class F extends E{    public $attr1 = 'F attr1 value';    public function oper1(){        parent::oper1();        echo 'F oper1<br />';        echo 'attr1 value = ', $this->attr1, '<br />';    }};$f = new F;$f->oper1();
ログイン後にコピー
以上代码只变动了一处地方,就是把父类$attr1的访问属性变成private,那重载机制如何执行呢?先看运行结果:

E oper1
attr1 value = E attr1 value //父类私有的属性
F oper1
attr1 value = F attr1 value


之前我们说过,private属性和方法子类是继承不了的,这种情况,遵循一个原则:

private属性在那个类里调用的,就显示哪个类里的属性值。

示例中的parent::oper1方法调用的是E类的oper1方法,在E的oper1方法内又调用了$this->attr1,attr1是private并没有被子类继承,因此,调用的就是类E里的attr1属性值。


<3>protected重载与public重载一致


<4>类属性的继承

class G{    public static $attr1 = 'G attr1 value';    public function oper1(){        echo 'G oper1<br />';        echo 'attr1 value = ', self::$attr1, '<br />';    }};class H extends G{    public static $attr1 = 'H attr1 value';    public function oper1(){        parent::oper1();        echo 'H oper1<br />';        echo 'attr1 value = ', self::$attr1, '<br />';    }};$h = new H;$h->oper1();
ログイン後にコピー

运行结果:

G oper1
attr1 value = G attr1 value
H oper1
attr1 value = H attr1 value

其实不管G类的attr1属性是public还是private,结果都一样。

个人是这么理解的,类属性可以继承,但谈不上重载,那关于子类调用父类的属性也有一规则:

self或者parent只代表本类,因此,根据这一原则可以断定,属性的值一定是本类属性的值,与子类无关。(特殊情况时php的静态延迟加载机制)。


七.静态延迟加载

既然已经提到了静态延迟加载,就趁热打铁讲一下,H和G的例子大家已经看了,那我就是想要在子类中调用父类的东东怎么办?静态延迟加载就是解决这个问题,请看两个示例:

示例1:

还是H和G类的例子

class G{    public static $attr1 = 'G attr1 value';    public function oper1(){        echo 'G oper1<br />';        echo 'attr1 value = ', static::$attr1, '<br />';    }};class H extends G{    public static $attr1 = 'H attr1 value';    public function oper1(){        parent::oper1();        echo 'H oper1<br />';        echo 'attr1 value = ', self::$attr1, '<br />';    }};$h = new H;$h->oper1();
ログイン後にコピー
运行结果:

G oper1
attr1 value = H attr1 value
H oper1
attr1 value = H attr1 value

上面代码只是将G类里的self::$attr1改写成了static::$attr1,运行结果就不一样了


示例2:

class I {    public static function who(){        echo __CLASS__, '<br />';    }    public static function test(){        static::who();    }};class J extends I{    public static function who(){        echo __CLASS__,'<br />';    }};
ログイン後にコピー

运行结果:

J


通过这两个例子,可以好好的领悟一下static的静态延迟绑定。


写的有点多,主要是因为一牵扯继承就停不下来....面向对象还有一些只是点,后面有时间再补上吧...谢谢,如若有错误的地方,敬请大家指出,随时更正,谢谢!!



このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles