My Photo

« PHPメモ008:include,require | Main | 2012シーズン新潟始動 #albirex »

January 27, 2012

PHPメモ009:クラス

Javaのクラスとかなり近い。

  • プロパティ(メンバ変数)、メソッドがある。
  • newでインスタンス化
  • extendsで継承。
  • メンバのアクセス権をpublic,protected,privateで指定する。
  • クラスとメソッドに対してfinalでオーバーライド禁止(プロパティには使用できない)。
  • abstractで抽象化。
  • interfaceとimplements。

クラスの定義

クラス名は大文字小文字を区別しない。

class <クラス名>
{
	<プロパティの定義>
	<メソッドの定義>
}

メンバへのアクセス

static、constで定義しメンバには"::"でアクセスする。
ここでの変数名には先頭の"$"がいる(定数名の方には定数だから "$" は不要)。

<クラス名|self|parent>::<変数名|定数名>

それ以外はのメンバには"->"でアクセスする。
ここでの変数名には先頭の"$"はいらない。

<クラス参照の変数の変数名>-><変数名>

アクセス権の指定

プロパティとメソッドに対するアクセス権はpublic,protected,privateで指定する。 メソッドでアクセス権の指定を省略した場合はpublicとなる。

public どこからでもアクセス可能
protected そのクラス自身、継承したクラス、親クラスからアクセス可能
private そのクラス自身
var publicと同じ。下位互換のためにある。PHP5では使用すべきではない。

親クラスから子クラスのメンバーにアクセスって、どうやるんだろう?

定数(const)

定数はconstを付けて宣言する。定数名には先頭の'$'はいらない。
#変数じゃないってことか。

$this

Javaの"this"と同じ。

self,parent

クラス定義の内部からメンバにアクセスするために使う。
selfはそのクラス自身、parentは親クラス。

コンストラクタ・デストラクタ

void __construct ([ mixed $args [, $... ]] )

下位互換のため __construct() がない場合はクラス名と同じ名前のメソッドがコンストラクタとして探されるが、PHP5では__construct()を使うべき。
子クラスのコンストラクタでは親クラスのコンストラクタは明示的に呼ばれないので"parent::__construct()"が必要。

デストラクタはオブジェクトを参照するものがひとつもなくなったときに呼ばれる。またスクリプトの終了時にも順不同で呼ばれる。

void __destruct ()

クラスのオートローディング

__autoload()関数を定義すると、未定義のクラスが使用され時に__autoload()が実行されてクラスをロードする。

function __autoload($class_name) {
    include $class_name . '.php';
}

サンプルコード

class A1
{
	const constant = 'A1_Constant';
	public static $stat = 'A1_Static';
	
	public    $pub = 'A1_Public';
	protected $pro = 'A1_Protected';
	private   $pri = 'A1_Private';
	
	public    $var1 = 'A1_var';
	
	// コンストラクタ
	public function __construct() {
		echo 'A1 constructor is called.' . "\n";
	}
	
	public function showProperties() {
		echo 'A1 showProperties() is called.' . "\n";
		echo '  constant=' . self::constant . "\n";
		echo '  $stat=' . self::$stat . "\n";
		echo '  $pub=' . $this->pub . "\n";
		echo '  $pro=' . $this->pro . "\n";
		echo '  $pri=' . $this->pri . "\n";
	}
	
	protected function proMethod() {
		echo 'A1 proMethod() is called.'. "\n";
	}
}

class A2 extends A1
{
	public    $var1 = 'A2_var';
	
	// コンストラクタ
	public function __construct() {
		parent::__construct();
		echo 'A2 constructor is called.' . "\n";
	}
	
	public function showProperties() {
		echo 'A2 showProperties() is called.' . "\n";
		echo '  constant=' . self::constant . "\n";
		echo '  $stat=' . self::$stat . "\n";
		echo '  $pub=' . $this->pub . "\n";
		echo '  $pro=' . $this->pro . "\n";
		echo '  $pri=' . $this->pri . "\n";
	}
	
	public function pubMethod() {
		echo 'A2 pubMethod() is called.' . "\n";
		$this->proMethod();
	}
}

echo 'A1::constant=' . A1::constant . "\n";
echo 'A1::$stat=' . A1::$stat . "\n";

$baseClass = new A1();
$baseClass->showProperties();
echo '$baseClass->pub=' . $baseClass->pub . "\n";
echo '$baseClass->var1=' . $baseClass->var1 . "\n";

echo 'A2::constant=' . A2::constant . "\n";
echo 'A2::$stat=' . A2::$stat . "\n";

$subClass = new A2();
$subClass->showProperties();
$subClass->pubMethod();
echo '$subClass->pub=' . $subClass->pub . "\n";
echo '$subClass->var1=' . $subClass->var1 . "\n";

出力

A1::constant=A1_Constant
A1::$stat=A1_Static
A1 constructor is called.
A1 showProperties() is called.
  constant=A1_Constant
  $stat=A1_Static
  $pub=A1_Public
  $pro=A1_Protected
  $pri=A1_Private
$baseClass->pub=A1_Public
$baseClass->var1=A1_var
A2::constant=A1_Constant
A2::$stat=A1_Static
A1 constructor is called.
A2 constructor is called.
A2 showProperties() is called.
  constant=A1_Constant
  $stat=A1_Static
  $pub=A1_Public
  $pro=A1_Protected
  $pri=
A2 pubMethod() is called.
A1 proMethod() is called.
$subClass->pub=A1_Public
$subClass->var1=A2_var

« PHPメモ008:include,require | Main | 2012シーズン新潟始動 #albirex »

PHP」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/53839105

Listed below are links to weblogs that reference PHPメモ009:クラス:

« PHPメモ008:include,require | Main | 2012シーズン新潟始動 #albirex »

May 2017
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof