そんなにGeekじゃないエンジニアブログ

PHPのクラスメンバ変数(プロパティ)、関数宣言でのstatic、constの扱いと動作まとめ

calendar

こんにちは。でんすけ(@notgeek_densuke)です。

今回はPHPのクラス変数や関数について。
static、constの扱いとか、
宣言時の書き方とか、
使う時に$が付くのかどうか、とか。

ややこしくてこんがらがりがち。
なのでまとめてみようと思います。

ちなみに、動作はideoneで手軽に確認してます。
確認時のPHPバージョンは7.1.0です。

スポンサーリンク

PHPクラスのメンバ変数(プロパティ)宣言

まずは宣言の仕方。
通常の変数、static、constはそれぞれこんな感じ。

<?php
class myclass{
	private $world = "hello world"; // OK

	static $staticworld = "hello static world"; //OK

	const CONSTWORLD = "hello const world"; // OK
}
new myclass();
?>

PHPで通常のメンバ変数(プロパティ)宣言

通常のプロパティ宣言は、
private $world;
のように、アクセス修飾子が必須です。

あるいはvarを付けるか。
ただし、これは古いPHPとの互換性のために残されたもので、publicと同じとみなされます。
通常は、public、protected、privateどれかで宣言すべし。

// OK case
public $world = "hello world";
protected $world = "hello world";
private $world = "hello world";
var $world = "hello world";

// error case
$world = "hello world";

あ、当然ながら、このコードをそのまま書いたら重複定義になってエラーになるのであしからず。

PHPでstaticメンバ変数(プロパティ)宣言

staticプロパティは、アクセス修飾子が必須じゃないです。
付けてもいいし、付けなくてもいい。
付けない場合はpublicです。

ただし、varはダメ。

// OK case
static $staticworld = "hello static world"; //public
private static $staticworld = "hello static world";
static private $staticworld = "hello static world";

// error case
var static $staticworld = "hello static world";
static var $staticworld = "hello static world";

PHPでconstメンバ変数(プロパティ)宣言

constの場合、$をつけないで宣言します。
$を付けるとエラーになります。

また、staticと同じく、constプロパティは、アクセス修飾子が必須じゃないです。
付けてもいいし、付けなくてもいい。
付けない場合はpublicです。

ただしvar、てめぇはダメだ。

そして、なぜか「const private」のようにconstを先に書くとだめっぽいです。なんでや。

また、変数を大文字で宣言するのが通例っぽいですが、小文字でも大丈夫。
大文字小文字が違うと別物の変数になります。

// OK case
const CONSTWORLD = "hello const world";
private const CONSTWORLD = "hello const world";
const constworld = "hello const small world"; // another variable

// error case
const private CONSTWORLD = "hello const world"; // error!! "private" after "const".
const $CONSTWORLD = "hello const world"; // error!! "$" is error

PHPでメンバ変数(プロパティ)を使う

さて、プロパティを宣言したら、次は使い方。

・通常のプロパティは $this->変数名
・staticプロパティは self::$付き変数名
・constプロパティは self::変数名

です。
動作確認はこんな感じ。

<?php
class myclass{
	private $world = "hello world";
	static $staticworld = "hello static world";
	const CONSTWORLD = "hello const world";
	function __construct(){
		print($world . "\n"); // empty

		$world = "world in function";

		print($world . "\n"); // world in function
		print($this->world . "\n"); // hello world
		print($this->$world . "\n"); // empty

		print(self::$staticworld . "\n"); // hello static world
		//print(self::staticworld . "\n"); // error!!
		print($this->staticworld . "\n"); // empty
		print($this->$staticworld . "\n"); // empty

		print(self::CONSTWORLD . "\n"); // hello const world
		print($this->CONSTWORLD . "\n"); // empty
	}
}
new myclass();
?>

通常のプロパティの「$this->」をつけ忘れると関数内で宣言された変数だと思って動きます。

その他、書き方を間違えると、ただの空変数だったり、エラー扱いだったりするので注意です。

PHPでconstメンバ関数の呼び出し方

今度は関数の方。

<?php
class myclass{
	function __construct(){
		//test(); // error!!
		$this->test();
		self::test();

		//statictest(); // error!!
		$this->statictest();
		self::statictest();
	}
	
	static function statictest(){
		print("static test\n");
	}

	static function test(){
		print("test\n");
	}
}
new myclass();
?>

PHPでstatic関数からのプロパティ呼び出し

static関数からのプロパティ呼び出しは、基本的にはstatic変数しかできない。

<?php
class myclass{
	private $world = "hello world";
	static $staticworld = "hello static world";
	const CONSTWORLD = "hello const world";
	function __construct(){
		self::statictest();
	}
	
	static function statictest(){
		//print($this->world . "\n"); // error!! world is not static
		print(self::$staticworld . "\n"); // hello static world
		print(self::CONSTWORLD . "\n"); // hello const world
	}
}
new myclass();
?>

と思ってたけど、意外とconstの変数も呼べたわ。

まとめ

ということで、PHPのメンバ変数、メンバ関数の使い方について確認してみました。

<宣言のしかた>
・通常の変数はアクセス修飾子付きで宣言する
・staticは$付き変数名で
・constは$無し。大文字で定義するのが通例。

<使い方>
・通常のプロパティは $this->変数名
・staticプロパティは self::$付き変数名
・constプロパティは self::変数名

<static関数>
・staticなメンバ関数からは、static、constプロパティのみ使える

てな感じです。
いろいろ、$付けたり付けなかったり、$thisだかself::だか、
ややこしいですが、整理していきましょう。

それではまたー。

この記事をシェアする

コメント

コメントはありません。

down コメントを残す




CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください