10

PHPでは、次の違いは何ですか。

  1. 定数と静的変数?
  2. クラスを拡張してそのオブジェクトを作成しますか?

使い方は知っていますが、はっきりと区別できません。

4

7 に答える 7

29

比較

静的

  1. アクセス修飾子を持つことができます。

    class A{
        public static $public_static = "can access from anywhere";
        protected static $protected_static = "can access from inheriting classes";
        private static $private_static = "can access only inside the class";
    }
    
  2. 可視性に応じて、静的変数にアクセスできます。

    //inside the class
        self::$variable_name;
        static::$variable_name;
    //outside the class
        class_name::$variable_name;
    
  3. 宣言後に値を変更できます。

        self::$variable_name = "New Value";
        static::$variable_name = "New Value";
    
  4. 宣言時に初期化する必要はありません。

        public static $variable_name; 
    
  5. 適用される通常の変数宣言ルール(例:$で始まる)

  6. 関数内に作成できます。

        class A{
            function my_function(){
                 static $val = 12;
                 echo ++$val; //13
            }
        }
    

絶え間ない

  1. 常にパブリックはアクセス修飾子を置くことができません(> PHP7.1)

    class A{
        const my_constant = "constant value";
        public const wrong_constant="wrong" // produce a parse error
    }
    
  2. どこでも定数にアクセスできます。

    //inside the class
        self::variable_name;
        static::variable_name;
    //outside the class
        class_name::variable_name;
    
  3. 宣言後に値を変更することはできません。

    self::variable_name = "cannot change"; //produce a parse error
    
  4. 宣言時に初期化する必要があります。

    class A{
        const my_constant = "constant value";// Fine
        const wrong_constant;// produce a parse error
    }
    
  5. 変数の先頭に$を使用しないでください(他の変数ルールが適用されます)。

     class A{
        const my_constant = "constant value";// Fine
        const $wrong_constant="wrong";// produce a parse error
    }
    
  6. 関数内で宣言できません。


伸ばすとき

    class A{

        public static $public_static = "can access from anywhere";
        protected static $protected_static = "can access from inheriting classes";
        private static $private_static = "can access only inside the class";
        
        const my_constant = "Constant value";
    }

    class B extends A{

        function output(){

            // you can use self or static

            echo self::$public_static; //can access from anywhere;
            echo self::$protected_static; //can access from inheriting classes;
            self::$protected_static = "Changed value from Class B";
            echo self::$protected_static; //"Changed value from Class B";
            
            echo self::$private_static; //Produce Fatal Error

            echo self::my_constant;//Constant value
        }
    }
于 2013-09-10T10:20:14.883 に答える
12

静的 は次の目的で使用されます。

静的なクラスプロパティまたはメソッドは、クラスのインスタンス化を必要とせずにそれらにアクセスできるようにします

したがって、静的メンバーによって返される値は異なる場合があります。たとえば、静的メソッドを呼び出して、渡すパラメータに応じて異なる結果を得ることができます。

定数値

(たとえば)変数、プロパティ、数学演算の結果、または関数呼び出しではなく、定数式である必要があります。

したがって、呼び出すと常に同じ結果が返されます

オブジェクトの作成とクラスの拡張について、「オブジェクトの作成」を行うと、クラスのインスタンスが作成されます。クラスを拡張すると、次のような他のクラスが作成されます。

親クラスからすべてのパブリックメソッドと保護されたメソッドを継承します。クラスがこれらのメソッドをオーバーライドしない限り、それらは元の機能を保持します。

お役に立てば幸いです。

于 2010-11-12T11:15:44.643 に答える
6

定数は定数であり、一度割り当てられるとその値を変更することはできません。一方、静的変数はさまざまな値を持つことができます。たとえば、関数内に静的変数を作成して、関数が呼び出された回数を知ることができます。値は 、関数が呼び出されるたびに変化します。たとえば、が変数$i++である場合などです。$istatic

についてはextending a class and creating its object、これは継承として知られています。詳細については、この投稿を確認してください。

于 2010-11-12T11:09:25.440 に答える
3

重要な違いの1つは、メモリの割り当てです。

クラス(オブジェクト)のインスタンスが作成されると、新しく作成されたオブジェクトにメモリが割り当てられます。staticという名前は、メモリ割り当ての性質にちなんで付けられました。つまり、静的オブジェクトのメモリは、静的に1回だけ割り当てられます。オブジェクトが静的プロパティを変更すると、同じクラスのすべてのオブジェクトに反映されます。

<?php
class Test {
    static $test = "world!";
    static function hello() {
        echo "\nhello " . self::$test . "\n";
    }
}

$t = new Test();
$x = new Test();

$t->hello(); // prints 'hello world!'
$t::$test = "Hmmm...";
$t->hello(); // prints 'hello Hmmm...'
$x->hello(); // prints 'hello Hmmm...'
于 2013-10-01T11:42:08.003 に答える
1

定数変数は、クラス名でアクセスできる変数であり、スクリプトの実行中に変更することはできません。クラス静的変数にもクラス名でアクセスできますが、プログラムの実行中に変更できます。

2番目の質問-これらは完全に他のものです。オブジェクト指向プログラミングについてもっと読む(PHPだけでなく)

于 2010-11-12T11:10:05.160 に答える
0

静的メンバー変数/関数を使用する理由は、そのクラスのインスタンスを作成しなくてもそのクラスに関する情報を抽出できるためです(CPUのオーバーヘッドが少なくて済みます)。

于 2012-12-23T20:00:23.520 に答える
-1

定数変数は、オブジェクトごとに異なります。ただし、静的変数はそのクラスのすべてのオブジェクトに共通です。各オブジェクトは単一の静的変数を共有します。クラスレベルで作成された静的変数。インスタンスレベルで作成される定数変数。

于 2014-05-21T05:34:34.473 に答える