const
PHP 5 では、との使用の違いは何static
ですか?
それぞれが適切なのはいつですか?public
そして、protected
とはどのような役割を果たしprivate
ますか?
const
PHP 5 では、との使用の違いは何static
ですか?
それぞれが適切なのはいつですか?public
そして、protected
とはどのような役割を果たしprivate
ますか?
クラスのコンテキストでは、静的変数は (オブジェクトではなく) クラス スコープにありますが、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) に関しては無関係です。これらは、静的変数を含むクラス変数にのみ役立ちます。
編集: PHP 7.1.0 で、クラス定数の可視性を指定するためのサポートが導入されたことに注意することが重要です。
最後に、const は常に static で public であることを確認してください。これは、次のようにクラス内から 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 は、誰がどのパラメーター/メソッドにアクセスできるかを示すアクセス修飾子です。
パブリックとは、他のすべてのオブジェクトがアクセスできることを意味します。Private は、インスタンス化されたクラスのみがアクセスできることを意味します。保護されているとは、インスタンス化されたクラスと派生クラスがアクセスできることを意味します。
@Mattのすばらしい答えを要約すると:
必要なプロパティを変更しない場合は、定数が適切な選択です
必要なプロパティの変更が許可されている場合は、代わりに static を使用してください
例:
class User{
private static $PASSWORD_SALT = "ASD!@~#asd1";
...
}
class Product{
const INTEREST = 0.10;
...
}
編集: PHP 7.1.0 では、クラス定数の可視性を指定するためのサポートが導入されたことに注意することが重要です。