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
Recent Comments