ホームページ > バックエンド開発 > PHPチュートリアル > PHP クラスの変数とメンバー、およびそれらを継承、アクセス、オーバーライドするときに注意すべき問題

PHP クラスの変数とメンバー、およびそれらを継承、アクセス、オーバーライドするときに注意すべき問題

WBOY
リリース: 2016-07-25 09:03:11
オリジナル
971 人が閲覧しました
  1. class Myclass{

  2. public $prop = 123;
  3. }

  4. $obj = new Myclass();

  5. ?>< ;/p>
コードをコピー
クラスのメンバー属性 (属性の名前は「メソッド」に相対的です) には、クラス定数とクラス変数が含まれます。クラス定数は定義時に空にすることはできません。また、クラス属性は空にする必要があります。 in 定義中に値が割り当てられた場合、使用できるのはスカラーと配列のみであり、式を使用することはできません。これは、クラス プロパティはコンパイル時に初期化され、PHP はコンパイル時に式を実行しないためです。

1. メンバーのアクセス制御: public: 継承可能で、$obj->prop などのクラスメソッドの外部でアクセスできます。 protected: 継承可能、クラスメソッド外からはアクセス不可 private: 継承できず、クラスメソッドの外部からアクセスすることもできません

PHP 4 ではクラス属性の宣言に var が使用されますが、PHP5 以降では使用されなくなりました。PHP5.3 以降では、public の前に使用することも、public の別名として単独で使用することもできます。

これら 3 つのアクセス制御キーワードは、クラスのコンストラクターを変更することもできます。private および protected がクラスのコンストラクターを変更する場合、この関数は外部の Accessed では使用できないため、オブジェクトをインスタンス化するためにコンストラクターを呼び出すことはできません。クラス、たとえばシングルトン クラスの実装:

  1. class Singleton {

  2. private static $instance=null;
  3. public $k = 88;
  4. private function __construct(){

  5. パブリック静的関数 getInstance(){

  6. if(self::$instance==null){
  7. self::$instance = new self();
  8. }

    ;
  9. return self::$instance;

  10. }

  11. public function __clone(){ //クローンのふりをします

  12. throw('シングルトンクラスはクローンできません');
  13. return self::getInstance();
  14. }
  15. }

  16. //new Singleton(); // エラー

  17. $in = Singleton::getInstance()?>/ p>
  18. コードをコピー
2. 継承は禁止されています

: Final キーワード、クラスまたはクラスメソッドの変更にのみ使用されます クラスがfinalで変更された場合、このクラスは継承できません。メソッドがfinalで変更された場合、このメソッドはサブクラスでオーバーライドできません。

class Myclass{
  • public $prop = 123;
  • Final public static function methodA(){//非継承の public static メソッド
  • return 'これは Final メソッドです'; }
  • }
  • ?>
  • 3. 抽象クラスと抽象メソッド
  • : 抽象クラスは、オブジェクトをインスタンス化するために直接使用することはできず、使用することのみが可能です。サブクラスを生成する
  • abstract class Myclass{ public $prop = 123; abstract public function methodA(); //抽象メソッドは関数 body を実装しません

    }
    ?>
    1. コードをコピーします
    2. 4. クラス定数とそのアクセス
    : クラス定数はアクセス制限修飾子を使用できません。クラス定数にアクセスするには、二重コロンを使用して継承可能です。クラス名またはクラスのインスタンスを使用してアクセスできます。

    class Myclass{ public $prop = 123; const x =999;

    public static function methodA(){

    return 'これは最後のメソッドです';
    }

      public function getConst(){

    1. return self::x; //または $this::x;
    2. }
    3. }
    4. $instance = new Myclass();

    5. echo Myclass::x;

    6. echo $instance::x;
    7. echo $instance->getConst();
    8. ?>
    9. コードをコピー
    10. クラスの定数は値です。定数名はコードのコンパイル中に対応する値に置き換えられ、実行時に変更することはできません。したがって、クラスの定数はクラス自体に関連付けられており、オブジェクトがインスタンス化される前にすでに存在します。したがって、クラス定数にはクラス名を使用して直接アクセスできます。

      1. {

      2. const m=200;
      3. public function getPConst(){
      4. returnparent::n;
      5. }
      6. }

      7. $p = new P();

      8. $s = new S( );
      9. echo $p::n; //100
      10. echo $s::n; //200 この定数名は親クラスから継承され、次の値に置き換えられます。 self::m はコンパイル時にクラスを区別する方法に注意してください。 self::m

        echo $s->>< ;/p>

      11. コードをコピー
      12. 5、クラス静的メンバーとアクセス
      static はクラスの属性とメソッドを変更できます。static によって変更されたメンバーはクラスのインスタンスではなくクラスに属します。静的メンバーはオブジェクトが作成される前に存在するため、クラス名と二重コロン:: を使用してアクセスする必要があります。したがって、静的メソッド内では、インスタンス自体を指す疑似変数 $this (または一般に $this ポインターとして知られる) を使用することは禁止されており、クラス名の代わりにキーワード self を使用できます。クラスのマジック定数 __CLASS__)。

      static を使用してクラスのコンストラクターを変更したり、インターフェイスで宣言されたメソッドを変更したりすることはできません。

      class Myclass{

      public static $x = 99;

      public function getX(){

      return self::$x; ;
      }
        }

      1. echo Myclass::x; //99

      2. ?>

      3. コードをコピー
      4. 静的メンバーはアクセス制御キーワードを使用できますサブクラスが親クラスの静的メソッドを (メソッドをオーバーライドせずに) 継承する場合、サブクラスは実際に親クラスの静的メソッドを呼び出すことに注意してください。静的メンバー ホルダーはオブジェクトではなくクラスであるため、クラスの複数のインスタンスは同じ静的プロパティを共有します。あるインスタンスの静的プロパティを変更すると、別のインスタンスの静的プロパティに影響します。

      class A{

      public static $a1 = 11;

      public $a2 = 22;

      < ;p> パブリック関数 showStatic(){
      return self::$a1;
        }

      1. public function getStatic(){

      2. return self::$a1;
      3. }

        ;
      4. public function getClassStatic(){

      5. $className = get_called_class();
      6. return $className::$a1;
      7. }

      8. public function getProp(){

      9. return $ this->a2;
      10. }
      11. }

      12. class B extends A{

      13. public static $a1 = 88;
      14. public $a2 = 99;
      15. }

      16. < p>$obj1 = new A();
      17. $obj2 = new B();

      18. echo A::showStatic(); //11

      19. echo $obj1->getStatic(); ; //11
      20. echo $obj1->getClassStatic(); //11
      21. echo $obj1->getProp(); //22

        echo B::showStatic(); /11 呼び出されるのは親クラスのメソッドであり、親クラスの静的メンバーにアクセスします

      22. echo $obj2->getStatic(); //11 呼び出されるのは親クラスのメソッドであり、メソッド内の self静的メソッドを保持するクラスを指します
      23. echo $obj2->getClassStatic(); //88
      24. echo $obj2->getProp(); //99
      25. ?>
      26. コードをコピー
      27. 後期静的バインディング: サブクラスが静的プロパティをオーバーライドし、継承されたメソッドを使用して親クラスの静的プロパティにアクセスすることを防ぐために、PHP5.3 では新しい構文を追加します: self の代わりに static キーワードを使用する後期静的バインディング キーワードget_called_class() によって返された同じクラス、つまり現在静的メソッドを呼び出しているオブジェクトが属するクラスを静的ポイントにします。このキーワードは静的メソッドにアクセスする場合にも有効です。

        1. public function getClassStatic(){
        2. $className = get_called_class()
        3. return $className::$a1;
        4. }

        5. public function getClassStatic(){
        6. return static::$a1;
        7. }

        8. //静的メソッドの場合

        9. //クラス A:
        10. public static function testStatic(){
        11. echo "

          testStatic of A

          ";
        12. }

        13. public function callStatic(){

        14. static::testStatic();
        15. } < ;/p>
        16. //クラス B:

        17. public static function testStatic(){
        18. echo "

          testStatic of B

          ";
        19. }
        20. //クラス B はクラスを継承しますA callStatic メソッドは、各クラスの testStatic メソッドに正しくアクセスできます。
        21. ?>

        コードをコピーします

        6. クラスまたはインスタンスを指すクラス メソッド内のいくつかのキーワード $this->propName $this はクラスのインスタンスを指します parent::xxxparent は親クラスを指します。親クラスの静的定数と静的プロパティにはアクセスできます。親クラスの非静的プロパティにはアクセスできません。親クラスの (静的かどうかに関係なく、プライベート メソッドにすることはできません) self::xxx self は、現在呼び出されているメソッドを定義するクラスを指します。静的メンバーとクラス定数にアクセスするために使用されます。 static::xxx は、現在のメソッドを呼び出したインスタンスをインスタンス化したクラスにアクセスし、静的メンバーと疲れた定数にアクセスするために使用されます。これと self の違いは、静的メンバーにアクセスするときに「遅延静的バインディング」が使用されることです。

        7. クラス継承における書き換えの問題: オーバーライドされたメンバーのアクセス制御レベルを狭めることはできません。たとえば、パブリック メンバーを保護としてオーバーライドすることはできません。 非静的メンバーを静的メンバーとしてオーバーライドすることはできず、静的メンバーを非静的メンバーとしてオーバーライドすることもできません

        8. インターフェースで定義されたメソッドはパブリックである必要があります。 クラスがインターフェイス メソッドを実装する場合、これらのメソッドもパブリックであり、具体的に実装されている必要があります (抽象にすることはできません)。 インターフェイスではインターフェイス定数を定義することもでき、その使用法はクラス定数とまったく同じですが、インターフェイスでは非関数メンバーを定義できません。 インターフェイスは相互に継承できます。インターフェイスの継承はカンマで区切って多重継承できます (サブクラスと親クラスの継承は単一継承です)。 クラスはカンマで区切って複数のインターフェースを実装できます。

        1. interface Ix extends Iy,Iz{
        2. public function a();
        3. }
        4. class Aimples Iy,Iz{
        5. .....
        6. }
        7. ?>
        コードをコピー

        9. 型制約

        PHPの関数(またはクラスメソッド)は宣言時にパラメータの型を制限できますが、それは配列またはオブジェクト(クラス/インターフェイス)にのみ制限できます。文字列型に制限されている場合、PHPはそれをオブジェクトパラメータであるとみなします。文字列クラスの。

        型がインターフェイスとして修飾されている場合、渡されるパラメータはインターフェイスを実装するクラスのインスタンスである必要があります。

        親クラスのメソッドをオーバーライドするインターフェースとサブクラスを実装する場合、すでに修飾されているパラメーターの型を変更することはできません。

        メソッドまたは関数を呼び出すときに、修飾されたパラメータの型と異なるデータが渡された場合、エラーが報告されますが、null パラメータは受け入れられます。

        1. interface Im{
        2. public function a( classm $m);
        3. }

        4. class A は Im{

        5. public function a を実装します($x){ // エラー、パラメータ $x はインターフェースの定義と一致するように classm タイプに制限する必要があります
        6. var_dump($x);
        7. }
        8. }
        9. ?>

        Copyコード

    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート