それでは、オブジェクト指向のカプセル化の問題を見てみましょう
カプセル化: 私の理解では、USB フラッシュ ドライブのインターフェイスを使用してコンピューターと対話しますが、内部の構造は見えません。この機能はカプセル化と呼ばれます。
利点: この機能を使用すると、毎回インターフェースを記述する必要がなく、他のコードでインターフェースを参照するだけで済み、コードの品質が向上し、バグのトラブルシューティングが軽減されます。
それでは、問題について考えてみましょう。どのパソコンにもパスワードがあり、他人が勝手にログインして、それをコピーして自分のコンピュータに貼り付けることは望ましくありません。また、人間のような物体においては、身長や年齢といった属性は自分自身でのみ増加させることができ、他人等が恣意的に値を割り当てることはできない。コードをカプセル化するためにキーワード private を使用します
リーリー
注: メンバー属性の前に他のキーワードがある限り、var を削除する必要がありますリーリー
出力結果は次のとおりです:
リーリー リーリー
リーリー
メンバーメソッドsay()はpublicであるため、クラスの外でsay()メソッドを呼び出すことができます:リーリー
コンストラクターはデフォルトのパブリックメソッドであるため(コンストラクターをプライベートに設定しないでください)、その設定をプライベートと呼ぶと、USBディスク内の唯一のインターフェイスを封印することと同じになり、このクラスにアクセスできなくなります
上記の例では、プライベート メンバーはクラス内でのみ使用でき、クラス外からは直接アクセスできないことがわかります。しかし、場合によってはプライベート属性を割り当てて読み取る必要があり、クラスに Provides を与える必要があります。外部からアクセス可能ないくつかのインターフェイス。 リーリー
次に、4 つのメソッド __set、__get、__isset、__unset のアプリケーションを理解する必要があります上記の説明の後、プライベートクラスをどのように運営するのかという質問があるかもしれません。 ? ? ? ?
__set設定: __get
リーリー
完全な例:リーリー
プログラム実行結果:
リーリー
上記のコードに __get() メソッドと __set() メソッドが追加されていない場合、プライベート メンバーはクラス外で操作できないため、プログラムは間違った動作をします。また、上記のコードは自動的に __get() メソッドと __set() メソッドを呼び出して支援します。カプセル化されたプライベート メンバーに直接アクセスします。
オブジェクトの外部で「isset()」関数を使用して、オブジェクト内のメンバーが設定されているかどうかを判断する場合、それを使用できますか?オブジェクト内のメンバーがパブリックである場合、この関数を使用してメンバー属性を測定できますが、プライベートなメンバー属性はカプセル化されているため、この関数は機能しません。外部に露出します。では、プライベートメンバー属性が設定されているかどうかを判断するためにオブジェクトの外部で「isset()」関数を使用することはできないのでしょうか?はい、「__isset()」メソッドをクラスに追加するだけで済みます。オブジェクト内のプライベートメンバーが設定されているかどうかを判断するために「isset()」関数がクラスの外部で使用される場合、この関数は内部で自動的に呼び出されます。 「__isset()」メソッドはそのような操作を完了するのに役立ち、「__isset()」メソッドをプライベートにすることもできます。次のコードをクラスに追加するだけです:
リーリー
完全な例リーリー
出力結果は次のとおりです:
リーリー
次に学ぶのは継承の知識です
以下は人間のコードです リーリー
以下は学生クラスのコードですリーリー
生徒のクラスを簡素化するリーリー
ここで考慮しなければならないのは、過負荷の問題です現時点では、PHP は言語であるため、PHP はオーバーロードできないのではないかと疑問に思われるかもしれません。従来の意味でのオーバーロードとは、同じメソッド名を持つ複数のメソッドがあり、異なるパラメータを使用することを意味します。さまざまなインターフェースを呼び出すため
オーバーロードとは、サブクラスによる親クラスのオーバーライドを意味します
リーリー
これは最終的な分析におけるこの方法の重要なポイントです:1.サブクラスは親クラスから継承する必要があります
2. サブクラスのメソッド名は親クラスのメソッド名と同じである必要があります
現時点で、このメソッドに 1000 行のコードがある場合、実装が非常に不便になる可能性があります
この時点では、「parent::メソッド名」メソッドを使用して、親クラスでオーバーライドされたメソッドを呼び出します。 リーリー
パブリック、プライベート、プロテクトの違い
リーリー上記のコードから次のように要約できます
パブリック: 外部からの直接アクセス
protected 间接的外部访问 像U盘和电脑一样 访问需要一个接口 而那个接口就是需要一个子类 (子类继承了父类的protected)
private 不能通过外部访问
既然谈到继承的问题 如果我们想要一个类不被继承那么我们可以用final 去进行定义(只能定义类和方法,不能定义成员属性)
1.final 标记的类不能被继承
2.final标记的方法不能被子类覆盖
<?php final class Person { function say() { } } class Student extends Person { function say() { } } ?>
会出现下面错误:
Fatal error: Class Student may not inherit from final class (Person)
<?php class Person { final function say() { } } class Student extends Person { function say() { } } ?>
理解static 和const的关键关键字的使用(self:)
static 字面上的意思就是静态的意思 现在你可能会问静态使用静态有什么好处?使用静态的好处是:如果示例话成千上万“人”的对象,里面都有一个共有的属性比如国籍“中国”,那么我们可以建国籍这个属性设置为静态,在内存在开辟出一个位置,实例化的过程中成千上万的人都会访问内存中这个位置
static成员能够限制外部的访问,因为static的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护;
这一点有点像网站中的全局变量
<? class Person { // 下面是人的静态成员属性 public static $myCountry = "中国"; // var $name; //人的名子 // 这是人的静态成员方法 public static function say() { echo "我是中国人"; } } // 输出静态属性 echo Person::$myCountry; // 访问静态方法 Person::say(); // 重新给静态属性赋值 Person::$myCountry = "美国"; echo Person::$myCountry; ?>
结果是:
中国我是中国人美国
也可以这么写
<?php class MyClass { // 定义一个常量constant const constant = 'constant value'; function showConstant() { echo self::constant . " "; // 使用self访问,不要加“$” } } echo MyClass::constant . " "; // 使用类名来访问,也不加“$” $class = new MyClass(); $class->showConstant(); // echo $class::constant; // 是不允许的 ?>
用“const”修饰的成员属性的访问方式和“static”修饰的成员访问的方式差不多,也是使用“类名”,在方法里面使用“self”关键字。但是不用使用“$”符号,也不能使用对象来访问。
<?php class MyClass { // 定义一个常量constant const constant = 'constant value'; function showConstant() { echo self::constant . " "; // 使用self访问,不要加“$” } } echo MyClass::constant . " "; // 使用类名来访问,也不加“$” $class = new MyClass(); $class->showConstant(); // echo $class::constant; // 是不允许的 ?>