php class のstaticプロパティについて教えてください。


http://php.net/manual/ja/language.oop5.static.php
マニュアルには、クラスのインスタンス化の必要なしにアクセスすることができます。
とあるのですが。

staticをつけてもつけなくても同じように表示されました。

class A {
public static function getAge(){
return "a";
}
}
echo A::getAge();
// a

class B {
public function getAge(){
return "b";
}
}
echo B::getAge();
//b

そういうことじゃないんでしょうか?
staticは何のために使うんでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/08/04 21:35:05

ベストアンサー

id:tobeoscontinue No.1

回答回数220ベストアンサー獲得回数59

A::getAge();
B::getAge();
はスコープ定義演算子による静的メソッド呼び出しでfunctionにstaticを付ける付けないとは直接関係が無い(たぶん)と思います。

>> クラスプロパティもしくはメソッドを static として宣言することで
と前置きがあるようにクラスプロパティをstaticとして宣言した変数にアクセスする場合にはクラスのインスタンス化の必要なしに
アクセスすることができます。ということです。

>> staticをつけてもつけなくても同じように表示されました。
A::getAge();
B::getAge();
では変数にアクセスしていないので結果には違いはありません。
そもそもstaticを付ける必要がなかったのです。
がA::getAge()はstaticが付いているのでクラスメソッドと成ります。
クラス変数にインスタンスメソッドが直接アクセスするのは好ましく無いと思われますので
クラスメソッドを経由してアクセスするようにするといいと思います。
アクセスする方法としてself,parent,static,$thisなどがあるようです。
継承がからむとややっこしくなるようなので
http://d.hatena.ne.jp/maeharin/20130202/php_late_static_bindings
http://qiita.com/ngyuki/items/0bbae663f9909ee551dc
など参考になるのではないでしょうか。

>> staticは何のために使うんでしょうか?
staticを必要とする場面は多くないと思いますが場合によってはstaticを使うことで簡単になったり
効率を期待できる場合があります。
class変数はインスタンス毎ではなくただ一度初期化されます。
この例ではclassを生成する時に$tを+1するというものです。
class Sではstatic宣言しているので初期化は一度行われるのみで後はclassを生成する度に1,2,3と増えていきます。
$tは生成された回数を表します。__destruct()で-1するようにすればその時の生成されている個数を知ることもできます。
class Dではclassを生成する度に$tを0で初期化するので1ばかりを返し意味がありません。

<?php
define("CR", "\n");

class S {
 private static $t = 0;
 public function __construct() {
  self::$t++;
  echo 'S::$t='.self::$t.CR;
 }
}

class D {
 private $t = 0;
 public function __construct() {
  $this->t++;
  echo 'D::$t='.$this->t.CR;
 }
}

$s1 = new S();
$s2 = new S();
$s3 = new S();
$d1 = new D();
$d2 = new D();
$d3 = new D();

変数を定数のように使う。
定数を使うのならconstを使えばいいのですがconstは変更が出来ません。
単純に変数では毎回代入が起こるので効率が悪そうです。
staticを加えることで両方の問題を解決できます。(但し動的変数に慣れているので勘違いからバグが入り込みやすくなるかも)
例のSampleでは$Tをstaticとしているので最初だけ代入されますが次回からはそのままなのでarray_shiftによって$Tは短くなっていきます。
Dampleでは毎回$Tに代入されるのでarray_shiftは無意味です。

<?php
function Sample() {
 static $T = array(1,2,3,4,5,6,7,8,9,10);
 echo count($T).CR;
 array_shift($T);
}

function Dample() {
 $T = array(1,2,3,4,5,6,7,8,9,10);
 echo count($T).CR;
 array_shift($T);
}

Sample();
Sample();
Sample();
Dample();
Dample();
Dample();

staticの使用はstaticでなければならない部分だけで積極的に使う必要はないように思います。

id:hrhakbn

丁寧に解説ありがとうございます!

プロパティのみの話だったんですね。勘違いしました。
それと初期化の特性についてだいぶ理解できました
ありがとうございます!

2014/08/14 15:01:18

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません