182

constPHP 5 では、との使用の違いは何staticですか?

それぞれが適切なのはいつですか?publicそして、protectedとはどのような役割を果たしprivateますか?

4

7 に答える 7

202

クラスのコンテキストでは、静的変数は (オブジェクトではなく) クラス スコープにありますが、const とは異なり、それらの値は変更できます。

class ClassName {
    static $my_var = 10;  /* defaults to public unless otherwise specified */
    const MY_CONST = 5;
}
echo ClassName::$my_var;   // returns 10
echo ClassName::MY_CONST;  // returns 5
ClassName::$my_var = 20;   // now equals 20
ClassName::MY_CONST = 20;  // error! won't work.

public、protected、および private は、const (常に public) に関しては無関係です。これらは、静的変数を含むクラス変数にのみ役立ちます。

  • public static 変数には、ClassName::$variable を介してどこからでもアクセスできます。
  • 保護された静的変数は、ClassName::$variable を介してクラスを定義するかクラスを拡張することによってアクセスできます。
  • プライベートな静的変数には、ClassName::$variable を介して定義クラスのみがアクセスできます。

編集: PHP 7.1.0 で、クラス定数の可視性を指定するためのサポートが導入されたことに注意することが重要です。

于 2009-11-06T07:14:27.110 に答える
20

最後に、const は常に static で public であることを確認してください。これは、次のようにクラス内から const にアクセスできることを意味します。

class MyClass
{
     const MYCONST = true;
     public function test()
     {
          echo self::MYCONST;
     }
}

クラスの外からは、次のようにアクセスします。

echo MyClass::MYCONST;
于 2010-03-04T01:57:45.590 に答える
11

定数は単なる定数です。つまり、宣言後にその値を変更することはできません。

静的変数は、クラスのインスタンスを作成せずにアクセスできるため、クラスのすべてのインスタンス間で共有されます。

また、(関数の最初の実行時に) 1 回だけ宣言され、関数呼び出し間でその値を格納できる関数内に静的ローカル変数が存在する場合があります。例:

function foo()
{
   static $numOfCalls = 0;
   $numOfCalls++;
   print("this function has been executed " . $numOfCalls . " times");
}
于 2009-11-06T10:49:38.907 に答える
10

selfクラスの継承について話すときは、キーワードとstaticキーワードを使用して、さまざまなスコープの定数または変数を区別できます。何にアクセスするかを示すこの例を確認してください。

class Person
{
    static $type = 'person';

    const TYPE = 'person';

    static public function getType(){
        var_dump(self::TYPE);
        var_dump(static::TYPE);

        var_dump(self::$type);
        var_dump(static::$type);
    }
}

class Pirate extends Person
{
    static $type = 'pirate';

    const TYPE = 'pirate';
}

そして、次のようにします。

$pirate = new Pirate();
$pirate::getType();

また:

Pirate::getType();

出力:

string(6) "person" 
string(6) "pirate" 
string(6) "person" 
string(6) "pirate"

つまりself::、呼び出されている同じスコープ (この場合はPersonスーパークラス)の静的プロパティと定数を参照しstatic::、実行時にスコープからプロパティと定数にアクセスします (この場合はPirateサブクラス)。

遅延静的バインディングの詳細については、php.net を参照してくださいまた、ここここ
で別の質問の回答を確認してください。

于 2015-06-24T16:04:43.840 に答える
4

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

クラス定数は通常の定数と同じで、実行時に変更することはできません。これは、const を使用する唯一の理由でもあります。

private、public、および protected は、誰がどのパラメーター/メソッドにアクセスできるかを示すアクセス修飾子です。

パブリックとは、他のすべてのオブジェクトがアクセスできることを意味します。Private は、インスタンス化されたクラスのみがアクセスできることを意味します。保護されているとは、インスタンス化されたクラスと派生クラスがアクセスできることを意味します。

于 2009-11-06T07:17:49.817 に答える
2

@Mattのすばらしい答えを要約すると:

  • 必要なプロパティを変更しない場合は、定数が適切な選択です

  • 必要なプロパティの変更が許可されている場合は、代わりに static を使用してください

例:

class User{
    private static $PASSWORD_SALT = "ASD!@~#asd1";
    ...
}

class Product{
    const INTEREST = 0.10;
    ...
}

編集: PHP 7.1.0 では、クラス定数の可視性を指定するためのサポートが導入されたことに注意することが重要です。

于 2013-12-17T10:06:16.067 に答える