web-dev-qa-db-ja.com

PHP 5:const vs static

PHP 5では、conststaticの使用の違いは何ですか?

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

161
Chris Jacob

クラスのコンテキストでは、静的変数はクラススコープ(オブジェクトではなく)スコープにありますが、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.

パブリック、保護、プライベートは、const(常にパブリック)の観点からは無関係です。これらは、静的変数を含むクラス変数に対してのみ有用です。

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

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

180
Matt Huggins

最後にすべき点は、constは常に静的でパブリックであるということです。これは、次のようにクラス内からconstにアクセスできることを意味します。

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

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

echo MyClass::MYCONST;
18
luoshiben

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

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

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

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

クラスの継承について話すときは、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の最新の静的バインディングについて
別の質問の答えも確認してください here および here

6
Wilt

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

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

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

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

4
alexn

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

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

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

例:

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

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

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

2
d.raev

これまでに静的メンバー、定数変数、およびアクセス修飾子(private、public、protected)について学んだことを示します。 定数

定義

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

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

注:変数の値をキーワードにすることはできません(例: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

?>

静的

定義

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

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

PHP 5.3.0の時点では、変数を使用してクラスを参照できます。 >変数の値をキーワードにすることはできません(例:self、parent、static)。

静的プロパティの例

<?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";

 ?>

Public、private、protected(A.K.Aアクセス修飾子)

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

リンク1ウィキペディア

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

定義

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

 <?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
   }

} 
 ?> 

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

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

  <?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)

  ?>

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

参照: php.net

コンセプトを理解してください。読んでくれてありがとう:) :)良いものを持っている

2
Jijo John