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

  1. class Myclass{

  2. public $prop = 123;
  3. }
  4. $obj = new Myclass();

  5. ?>
コードをコピー
クラスのメンバー属性 (属性の名前は「メソッド」に相対的です) には、クラス定数とクラス変数が含まれます。クラス定数は定義時に空にすることはできません。また、クラス属性は空にする必要があります。 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. } p>
    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->>

      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;
      パブリック関数 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. $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 までご連絡ください。
    PHPおよびPython:さまざまなパラダイムが説明されていますPHPおよびPython:さまざまなパラダイムが説明されていますApr 18, 2025 am 12:26 AM

    PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

    PHPとPython:彼らの歴史を深く掘り下げますPHPとPython:彼らの歴史を深く掘り下げますApr 18, 2025 am 12:25 AM

    PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

    PHPとPythonの選択:ガイドPHPとPythonの選択:ガイドApr 18, 2025 am 12:24 AM

    PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

    PHPとフレームワーク:言語の近代化PHPとフレームワーク:言語の近代化Apr 18, 2025 am 12:14 AM

    PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

    PHPの影響:Web開発などPHPの影響:Web開発などApr 18, 2025 am 12:10 AM

    phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

    スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?Apr 17, 2025 am 12:25 AM

    PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

    PHPは、オブジェクトのクローニング(クローンキーワード)と__Clone Magicメソッドをどのように処理しますか?PHPは、オブジェクトのクローニング(クローンキーワード)と__Clone Magicメソッドをどのように処理しますか?Apr 17, 2025 am 12:24 AM

    PHPでは、クローンキーワードを使用してオブジェクトのコピーを作成し、\ _ \ _クローンマジックメソッドを使用してクローン動作をカスタマイズします。 1.クローンキーワードを使用して浅いコピーを作成し、オブジェクトのプロパティをクローン化しますが、オブジェクトのプロパティはクローニングしません。 2。\ _ \ _クローン法は、浅いコピーの問題を避けるために、ネストされたオブジェクトを深くコピーできます。 3.クローニングにおける円形の参照とパフォーマンスの問題を避けるために注意し、クローニング操作を最適化して効率を向上させます。

    PHP対Python:ユースケースとアプリケーションPHP対Python:ユースケースとアプリケーションApr 17, 2025 am 12:23 AM

    PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。

    See all articles

    ホット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ヘンタイを無料で生成します。

    ホットツール

    WebStorm Mac版

    WebStorm Mac版

    便利なJavaScript開発ツール

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    AtomエディタMac版ダウンロード

    AtomエディタMac版ダウンロード

    最も人気のあるオープンソースエディター

    DVWA

    DVWA

    Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

    Safe Exam Browser

    Safe Exam Browser

    Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。