PHPマニュアルのstatic
4022 ワード
前言
PHPマニュアルシリーズの文章は、いくつかのマニュアルの中の面白い評論を選んで翻訳マニュアルカタログを行います:言語の参考---類と対象---staticの参考の詳細
コメント親static変数を子クラスで上書きし、親メソッドを呼び出して子クラスのstaticを変更します.結果は予想通り にはなりません.
出力 static変数は、サブクラス間で を共有することができる.次のようにコードを書こうとするとfatal error が発生します.
phpの以前にselfがコードクラスを指す問題について議論したが、$thisキーワードはselfとは異なり、呼び出されたクラスインスタンス を指す.あるクラスが継承されると、そのstatic属性も「継承を参照」(カスタマイズされた言い方、分かりやすく、以下同じ)されて子クラス、すなわち子クラスと親クラスが共にstaticを保有し、彼らのいずれかのstaticの変更は に相互に影響します.
ただし、同じシーンでstaticメソッドまたは非staticメソッドが「コピー継承」されている場合、このメソッド内のstatic変数または非static変数は異なるクラスで互いに独立します.
このときのクラスcとクラスaのfunction vに対する操作は互いに独立しており,ここでfunction vはfinalキーワードを用い,サブクラスのvに対する上書きを防止できる.別の親アクセスサブクラスstatic属性の方
実際には、クラス
PHPマニュアルシリーズの文章は、いくつかのマニュアルの中の面白い評論を選んで翻訳マニュアルカタログを行います:言語の参考---類と対象---staticの参考の詳細
コメント
class A {
protected static $a;
public static function init($value) { self::$a = $value; }
public static function getA() { return self::$a; }
}
class B extends A {
protected static $a; // redefine $a for own use
// inherit the init() method
public static function getA() { return self::$a; }
}
B::init('lala');
echo 'A::$a = '.A::getA().'; B::$a = '.B::getA();
出力
A::$a=lala; B::$a=
、使用B::init()はA::staticへの変更です.ここでA::init()はselfをstaticに変更して遅延バインドする必要があります.class MyParent {
protected static $variable;
}
class Child1 extends MyParent {
function set() {
self::$variable = 2;
}
}
class Child2 extends MyParent {
function show() {
echo(self::$variable);
}
}
$c1 = new Child1();
$c1->set();
$c2 = new Child2();
$c2->show(); // prints 2
class Base
{
static function Foo ()
{
self::Bar();
}
}
class Derived extends Base
{
function Bar ()
{
echo "Derived::Bar()";
}
}
Derived::Foo(); // we want this to print "Derived::Bar()",but sorry,fatal error!
phpの
self::
は、実際に呼び出すself
のクラスではなく、そのコードが存在するクラスの属性または方法のみを指す.__CLASS__
の代わりにself
を使用することはできません.それは二度と現れないからです.:の前にあり、self
と同じように実際に呼び出されたクラスを指すことはできません.このように座らなければならない場合は、下を使用する必要があります.class Base
{
static function Foo ($class = __CLASS__)
{
//$class::Bar();
call_user_func(array($class,'Bar'));
}
}
class Derived extends Base
{
function Bar ()
{
echo "Derived::Bar()";
}
}
Derived::Foo('Derived'); //output Derived::Bar()
class a {
public function get () {
echo $this->connect();
}
}
class b extends a {
private static $a;
public function connect() {
return self::$a = 'b';
}
}
class c extends a {
private static $a;
public function connect() {
return self::$a = 'c';
}
}
$b = new b ();
$c = new c ();
$b->get(); //output b
$c->get(); //output c
class a
のfunction get()
は、呼び出しクラスによって異なる$this
を解釈するclass a
{
public static $s;
public function get()
{
return self::$s;
}
}
class b extends a { }
class c extends b { }
a::$s = 'a';
$c = new c();
echo $c->get(); // a
ただし、同じシーンでstaticメソッドまたは非staticメソッドが「コピー継承」されている場合、このメソッド内のstatic変数または非static変数は異なるクラスで互いに独立します.
class a
{
public final function v($vs = null)
{
static $s = null;
if(!is_null($vs))
$s = $vs;
return $s;
}
}
class b extends a { }
class c extends b { }
$a = new a();
$a->v('a');
$aa = new a();
$aa->v('last a');
$c = new c();
$c->v('c');
echo $a->v().' - '.$c->v(); // last a - c
このときのクラスcとクラスaのfunction vに対する操作は互いに独立しており,ここでfunction vはfinalキーワードを用い,サブクラスのvに対する上書きを防止できる.
class A {
public static $my_vars = "I'm in A";
static function find($class) {
$vars = get_class_vars($class) ;
echo $vars['my_vars'] ;
}
}
class B extends A {
public static $my_vars = "I'm in B";
}
A::find("B"); // Result : "I'm in B"
実際には、クラス
B
を渡すと、$class::$my_vars
を直接使用して呼び出すことができます.ここでは、異なる方法としてのみ使用します.