2019/1/5 static変数・メソッド スコープ定義演算子:: について

(注意)記事中に初心者の推測が含まれていますので情報を鵜呑みにするかどうかは自己責任でお願いします。

スコープ定義演算子(::)を使う。

①static(静的)プロパティに静的にアクセス(::(ダブルコロン)を用いてアクセス)をする(実行出来た)

<?php
class supera{
	
	public $d_pro_supa='d_pro_supa';
	
	public function d_meth_supa(){
		echo 'calling d_meth_a';
	}
	
	public static $s_pro_supa='s_pro_supa';
	
	public static function s_meth_supa(){
		echo 'calling meth_a now';
	}
}

class suba extends supera{
	public static function s_meth_suba(){
		echo parent::$s_pro_supa;
	}

}

suba::s_meth_suba();  //s_pro_supa

②static(静的)プロパティに動的アクセス(->を用いてアクセス)をする(エラー)

<?php
class supera{
	
	public $d_pro_supa='d_pro_supa';
	
	public function d_meth_supa(){
		echo 'calling d_meth_a';
	}
	
	public static $s_pro_supa='s_pro_supa';
	
	public static function s_meth_supa(){
		echo 'calling meth_a now';
	}
}

class suba extends supera{
	public static function s_meth_suba(){
		echo parent->$s_pro_supa;
	}

}

suba::s_meth_suba();
//Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ';'

 


②-➋superaクラスのインスタンスを生成し、superaクラスの静的プロパティに動的に(->を用いて)アクセスする(警告Notice)

<?php
class supera{
	
	public $d_pro_supa='d_pro_supa';
	
	public function d_meth_supa(){
		echo 'calling d_meth_a';
	}
	
	public static $s_pro_supa='s_pro_supa';
	
	public static function s_meth_supa(){
		echo 'calling meth_a now';
	}
}

$ins=new supera();
echo $ins->s_pro_supa;

//Notice: Accessing static property aaaa\bbbb\supera::$s_pro_supa as non static in C:\xampp\htdocs\Foo\Foooo.php on line 58

//Notice: Undefined property: aaaa\bbbb\supera::$s_pro_supa in C:\xampp\htdocs\Foo\Foooo.php on line 58

http://php.net/manual/ja/language.oop5.static.php#language.oop5.static.properties


③-➊静的でないプロパティに静的にアクセス(::(ダブルコロン)を用いてアクセス)する(エラー)

<?php
class supera{
	
	public $d_pro_supa='d_pro_supa';
	
	public function d_meth_supa(){
		echo 'calling d_meth_a';
	}
	
	public static $s_pro_supa='s_pro_supa';
	
	public static function s_meth_supa(){
		echo 'calling meth_a now';
	}
}

class suba extends supera{
	public static function s_meth_suba(){
		echo parent::$d_pro_supa;
	}

}

suba::s_meth_suba();
//Fatal error: Uncaught Error: Access to undeclared static property: s
upera::$d_pro_supa

③-➋サブクラスの静的メソッドからスーパークラスの動的プロパティにアクセスしたいので$this->を用いてアクセスしてみる(エラー)

<?php
class supera{
	
	public $d_pro_supa='d_pro_supa';
	
	public function d_meth_supa(){
		echo 'calling d_meth_supa';
	}
	
	public static $s_pro_supa='s_pro_supa';
	
	public static function s_meth_supa(){
		echo 'calling s_meth_supa right now';
	}
}

class suba extends supera{
	public static function s_meth_suba(){
		echo $this->$d_pro_supa;
	}
}

suba::s_meth_suba();
//Fatal error: Uncaught Error: Using $this when not in object context

静的メソッドの中で$this->は使えない。静的メソッドs_meth_suba()を静的に呼び出した時に、中の$thisは何を指すのか、ということになってしまう、ということか。

 


④静的でないプロパティに動的アクセス(->を用いてアクセス)をする(エラー)

<?php
class supera{
	
	public $d_pro_supa='d_pro_supa';
	
	public function d_meth_supa(){
		echo 'calling d_meth_a';
	}
	
	public static $s_pro_supa='s_pro_supa';
	
	public static function s_meth_supa(){
		echo 'calling meth_a now';
	}
}

class suba extends supera{
	public static function s_meth_suba(){
		echo parent->$d_pro_supa;
	}

}

suba::s_meth_suba();

//Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ';'

self,parentは(::)(ダブルコロン)といっしょに用いて静的プロパティにアクセスできる。


⑤静的なメソッドを静的に(::(ダブルコロン)を用いて)呼び出す。(実行出来た)

<?php
class supera{
	
	public $d_pro_supa='d_pro_supa';
	
	public function d_meth_supa(){
		echo 'calling d_meth_supa';
	}
	
	public static $s_pro_supa='s_pro_supa';
	
	public static function s_meth_supa(){
		echo 'calling s_meth_supa now';
	}
}

class suba extends supera{
	public static function s_meth_suba(){
		echo parent::s_meth_supa();
	}

}

suba::s_meth_suba();
//calling s_meth_supa now

⑥静的なメソッドを動的に(->を用いて)呼び出す。(エラー)

<?php
class supera{
	
	public $d_pro_supa='d_pro_supa';
	
	public function d_meth_supa(){
		echo 'calling d_meth_a';
	}
	
	public static $s_pro_supa='s_pro_supa';
	
	public static function s_meth_supa(){
		echo 'calling s_meth_a now';
	}
}

class suba extends supera{
	public static function s_meth_suba(){
		echo parent->s_meth_supa();
	}

}

suba::s_meth_suba();
//Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ';'

parentは::といっしょに用いる。


⑦サブクラスのメソッド内でself::を用いてスーパークラスの静的メソッドを呼び出す。(実行できた)

<?php
class supera{
	
	public $d_pro_supa='d_pro_supa';
	
	public function d_meth_supa(){
		echo 'calling d_meth_supa';
	}
	
	public static $s_pro_supa='s_pro_supa';
	
	public static function s_meth_supa(){
		echo 'calling s_meth_supa right now';
	}
}

class suba extends supera{
	public static function s_meth_suba(){
		echo self::s_meth_supa();
	}

}

suba::s_meth_suba();
//calling s_meth_supa right now

実行できた。つまり継承した場合、スーパークラスの静的メソッドもサブクラスに引き継がれる。だからサブクラス定義中でself::を用いて呼び出せる、ということだと思われる(推測)


基本的に「静的」と「動的」は分けないといけない。

静的でないプロパティはインスタンスからアクセスするためのもの。個々のインスタンス専用の変数(プロパティ)。

静的なプロパティ(static property)は個々のインスタンスによらずクラス共通の変数(プロパティ)。アクセスしたいときは静的にアクセスする。

コメントを残す

メールアドレスが公開されることはありません。