回答:
クラスのコンテキストでは、静的変数はクラススコープ(オブジェクトではない)スコープにありますが、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です)の点では無関係です。これらは、静的変数を含むクラス変数にのみ役立ちます。
編集:PHP 7.1.0では、クラス定数の可視性を指定するためのサポートが導入されたことに注意することが重要です。
$
か?static $my_var = 10;
定義内
static
変数がシングルトンや再帰関数でも非常に役立つことを説明しています。値を変更することはできますが、変数は一度しか初期化されません。シングルトンの作成方法の詳細については、stackoverflow.com / questions / 203336 /…を参照してください。私にとっては、静的変数を好むいくつかの状況があります。
もう1つ注意すべき点は、constは常に静的でパブリックであるということです。つまり、次のようにクラス内からconstにアクセスできます。
class MyClass
{
const MYCONST = true;
public function test()
{
echo self::MYCONST;
}
}
クラスの外から次のようにアクセスします。
echo MyClass::MYCONST;
定数は単なる定数です。つまり、宣言後にその値を変更することはできません。
静的変数は、クラスのインスタンスを作成せずにアクセスできるため、クラスのすべてのインスタンス間で共有されます。
また、(関数の最初の実行時に)1度だけ宣言され、関数呼び出し間でその値を格納できる静的ローカル変数を関数に含めることができます。例:
function foo()
{
static $numOfCalls = 0;
$numOfCalls++;
print("this function has been executed " . $numOfCalls . " times");
}
クラスの継承について話すときは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をご覧ください。
また、こちらとこちらの別の質問の回答も確認してください。
クラスのメソッドまたはプロパティを静的として宣言すると、クラスのインスタンス化を必要とせずにアクセスできるようになります。
クラス定数は通常の定数と同じで、実行時に変更することはできません。これは、constを使用する唯一の理由でもあります。
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
?>
静的
定義
静的キーワードは、クラス、メンバー関数、または変数を宣言するために使用できます。クラス内の静的メンバーには、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";
?>
パブリック、プライベート、保護(別名アクセス修飾子)
以下の定義を読む前に、カプセル化に関するこの記事を読んでください。概念をより深く理解するのに役立ちます。
定義
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
コンセプトをご理解いただければ幸いです。:) :)読んでくれてありがとう
@Mattのすばらしい答えを要約すると:
必要なプロパティを変更しない場合は、定数が適切な選択です
必要なプロパティの変更が許可されている場合は、代わりにstaticを使用してください
例:
class User{
private static $PASSWORD_SALT = "ASD!@~#asd1";
...
}
class Product{
const INTEREST = 0.10;
...
}
編集:PHP 7.1.0では、クラス定数の可視性を指定するためのサポートが導入されたことに注意することが重要です。
self::$variable
保護された静的変数とプライベート静的変数を使用することを好みます。クラスの最初にあるクラス名をそれ自体の中で一度だけ言及することを好むからです。