PHP 5:constとstatic


回答:


187

クラスのコンテキストでは、静的変数はクラススコープ(オブジェクトではない)スコープにありますが、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はconsts(常にpublicです)の点では無関係です。これらは、静的変数を含むクラス変数にのみ役立ちます。

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

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


27
self::$variable保護された静的変数とプライベート静的変数を使用することを好みます。クラスの最初にあるクラス名をそれ自体の中で一度だけ言及することを好むからです。
Lukman、

3
はい、良い点です。クラス自体の内部から参照する場合は、selfキーワードを使用できることを忘れていました。上記で提供した例は、クラス定義の外部で実行されました。その場合、クラス名を使用する必要があります。
Matt Huggins、

受け入れに非常に近い素晴らしい答え。「パブリック、保護、プライベートはconstsには無関係」-なぜですか?constはデフォルトですべてパブリックですか?すべてプライベート?
クリスジェイコブ

1
静的変数は必要ありません$か?static $my_var = 10;定義内
Daniel W.

古いスレッドですが、何か追加したいと思います。php.net/ manual / en /…をチェックして ください。これは、static変数がシングルトンや再帰関数でも非常に役立つことを説明しています。値を変更することはできますが、変数は一度しか初期化されません。シングルトンの作成方法の詳細については、stackoverflow.com / questions / 203336 /…を参照してください。私にとっては、静的変数を好むいくつかの状況があります。
Erik van de Ven 2016年

20

もう1つ注意すべき点は、constは常に静的でパブリックであるということです。つまり、次のようにクラス内からconstにアクセスできます。

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

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

echo MyClass::MYCONST;

1
その宣言は本当ですか?「constは常に静的でパブリック」ですか?
apil.tamang 2015年

7
これはもはや真実ではありません。PHP 7.1以降、クラス定数はプライベートまたは保護として宣言できます。RFCを
DisgruntledGoat

11

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

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

また、(関数の最初の実行時に)1度だけ宣言され、関数呼び出し間でその値を格納できる静的ローカル変数を関数に含めることができます。例:

function foo()
{
   static $numOfCalls = 0;
   $numOfCalls++;
   print("this function has been executed " . $numOfCalls . " times");
}

7

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

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をご覧ください
また、こちらこちらの別の質問の回答も確認してください


4

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

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

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

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


2

これは、静的メンバー、定数変数、アクセス修飾子(プライベート、パブリック、保護)についてこれまでに学んだことです。 絶え間ない

定義

名前が示すように、定数変数の値は変更できません。定数は通常の変数とは異なり、$記号を使用して宣言または使用しません。

値は、(たとえば)変数、プロパティ、数学演算の結果、または関数呼び出しではなく、定数式でなければなりません。

注:変数の値をキーワードにすることはできません(例:self、parent、static)。

PHPでの定数の宣言

<?php
class constantExample{

   const CONSTANT = 'constant value'; //constant

 }
?>

定数のスコープはグローバルであり、selfキーワードを使用してアクセスできます

<?php
class MyClass
{
    const CONSTANT = 'constant value';

    function showConstant() {
        echo  self::CONSTANT . "\n";
    }
}

echo MyClass::CONSTANT . "\n";

$classname = "MyClass";
echo $classname::CONSTANT . "\n"; // As of PHP 5.3.0

$class = new MyClass();
$class->showConstant();

echo $class::CONSTANT."\n"; // As of PHP 5.3.0

?>

静的

定義

静的キーワードは、クラス、メンバー関数、または変数を宣言するために使用できます。クラス内の静的メンバーには、selfキーワードを使用してグローバルにアクセスすることもできます。静的としてクラスプロパティまたはメソッドを宣言すると、クラスのインスタンス化を必要とせずにアクセスできるようになります。staticとして宣言されたプロパティは、インスタンス化されたクラスオブジェクトではアクセスできません(staticメソッドではアクセスできます)。可視性宣言(public、private、protected)が使用されていない場合、プロパティまたはメソッドは、それがpublicとして宣言されているかのように扱われます。静的メソッドは、オブジェクトのインスタンスを作成せずに呼び出すことができるためです。

注:疑似変数$ thisは、静的として宣言されたメソッド内では使用できません。静的プロパティには、矢印演算子を使用してオブジェクトからアクセスすることはできません->

PHP 5.3.0以降では、変数を使用してクラスを参照することが可能です。>変数の値をキーワードにすることはできません(例:自己、親、静的)。

静的プロパティの例

<?php
class Foo
{
    public static $my_static = 'foo'; //static variable 

    public static function staticValue() { //static function example
        return self::$my_static;  //return the static variable declared globally
    }
}

?>

静的プロパティと関数の例へのアクセス

 <?php
     print Foo::$my_static . "\n";

    $foo = new Foo();
    print $foo->staticValue() . "\n";
    print $foo->my_static . "\n";      // Undefined "Property" my_static 

    print $foo::$my_static . "\n";
    $classname = 'Foo';
    print $classname::$my_static . "\n"; // As of PHP 5.3.0

    print Bar::$my_static . "\n";
    $bar = new Bar();
    print $bar->fooStatic() . "\n";

 ?>

パブリック、プライベート、保護(別名アクセス修飾子)

以下の定義を読む前に、カプセル化に関するこの記事を読んでください。概念をより深く理解するのに役立ちます。

リンク1ウィキペディア

カプセル化に関するチュートリアルポイントリンク

定義

private、public、protectedキーワードを使用すると、クラスのメンバーへのアクセスを制御できます。publicと宣言されたクラスメンバーはどこからでもアクセスできます。保護されていると宣言されたメンバーは、クラス自体内で、継承された親クラスからのみアクセスできます。プライベートとして宣言されたメンバーは、メンバーを定義するクラスによってのみアクセスできます。

 <?php 
class Example{
 public $variable = 'value'; // variable declared as public 
 protected $variable = 'value' //variable declared as protected
 private $variable = 'value'  //variable declared as private

 public function functionName() {  //public function
 //statements
 }

 protected function functionName() {  //protected function
 //statements
 }
  private function functionName() {  //private function
   //statements
   }

} 
 ?> 

パブリック、プライベート、および保護されたメンバーの例へのアクセス

パブリック変数は、クラスの外部またはクラスの内部からアクセスおよび変更できます。ただし、クラス内からのみプライベートおよび保護された変数と関数にアクセスできます。クラス外の保護されたメンバーまたはパブリックメンバーの値を変更することはできません。

  <?php 
  class Example{
    public $pbVariable = 'value'; 
    protected $protVariable = 'value'; 
    private $privVariable = 'value';
    public function publicFun(){

     echo $this->$pbVariable;  //public variable 
     echo $this->$protVariable;  //protected variable
     echo $this->privVariable; //private variable
    }

   private function PrivateFun(){

 //some statements
  }
  protected function ProtectedFun(){

 //some statements
  }

  }


 $inst = new Example();
 $inst->pbVariable = 'AnotherVariable'; //public variable modifed from outside
 echo $inst->pbVariable;   //print the value of the public variable

 $inst->protVariable = 'var'; //you can't do this with protected variable
 echo $inst->privVariable; // This statement won't work , because variable is limited to private

 $inst->publicFun(); // this will print the values inside the function, Because the function is declared as a public function

 $inst->PrivateFun();   //this one won't work (private)
 $inst->ProtectedFun();  //this one won't work as well (protected)

  ?>

詳細については、可視性Visibility Php Docに関するこのphpドキュメントをご覧ください。

参照:php.net

コンセプトをご理解いただければ幸いです。:) :)読んでくれてありがとう


2

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

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

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

例:

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.