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

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

Jul 25, 2016 am 09:03 AM

  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コード

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

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

    SublimeText3 中国語版

    SublimeText3 中国語版

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

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

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

    Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

    Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

    PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

    PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

    Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

    Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

    Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

    顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

    PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

    記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

    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.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

    フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

    記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

    See all articles