PHPクラスの全機能を一挙公開。継承、抽象クラス、clone、明示的なインスタンス解放など。基本構文から高度なオブジェクト操作まで、現場品質のサンプルプログラムを掲載。
インスタンスは new 命令を使用し生成する。
<?php
class MyClass {
}
$mycls = new MyClass(); /* クラスのインスタンスを生成 */
?>| public | protected | private | 宣言なし | var 非推奨 | |
|---|---|---|---|---|---|
| 親クラス | 〇 | 〇 | × | 〇 | 〇 |
| 自クラス | 〇 | 〇 | 〇 | 〇 | 〇 |
| 子孫クラス | 〇 | 〇 | × | 〇 | 〇 |
| インスタンス | 〇 | × | × | 〇 | 〇 |
private で宣言したプロパティ、メソッドは、宣言したクラス内のみアクセス可能である。
以下のコードは、クラス内で private $name を宣言し、クラス内のメソッドから $this->name で アクセスしている。
重要なポイントは、クラスのプロパティである $this->name と、クラスのメソッド内(引数)で定義した ローカル変数 $name を使い分けている点だ。
同じ名前の変数($name)でも、プロパティとメソッド内のローカル変数は別の扱いとなる。
※ $this->name は オブジェクトのプロパティだが、$this->$name は 可変プロパティ になるので注意が必要。
Java、C#などの厳格な言語仕様のプログラミング言語と比較し、PHPは言語仕様書がなく、公式ドキュメント(PHP Manual)や実際の動作(挙動)が事実上の仕様として扱われてきた歴史を持っている。
$this->$name に似たような記述は、バグの温床になるので、厳格な言語仕様のプログラミング言語ではできない(コンパイルエラー)。
<?php
class MyClass {
private $name; /* private変数を定義 */
function setName($name) {
$this->name = $name; /* private変数 $name に setNameの引数 $name の内容を代入*/
/*
$thisはクラス内のプロパティやメソッドにアクセスできる。
$this->name = $name の左辺の $this->name は
クラス冒頭で定義された private $name を指している。
$this->name = $name の右辺の $name は
function setName($name) 引数 $name を指している。
*/
}
function getName() {
return $this->name; /* private変数 $name の値を返す */
}
}
$mycls = new MyClass(); /* クラスのインスタンスを作成 */
$mycls->setName('hogehoge'); /* setName()メソッドに値を設定する */
echo $mycls->getName(); /* getName()メソッドで値を取得し出力する */
?>protected で宣言したプロパティ、メソッドは、宣言したクラス内、親クラス、継承したクラスからアクセス可能である。インスタンスからアクセスはできない。
以下のコードは、クラス内で protected $name を宣言し、クラス内のメソッドから $this->name で アクセスしている。
$mycls = new MyClass(); で MyClass のインスタンス $mycls を作成し、$mycls->getName(); で getName メソッドの呼び出しを行っている。
コメントアウトしている echo $mycls->name; は、protected プロパティに外部からアクセスしているのでパースエラーが発生する。
パースエラー(構文エラー)は、PHPがコードをパース(構文解釈)する段階で止まってしまうエラーで、多くの場合、間違った構文 ; の付け忘れ、{} () の閉じ忘れなどを記述して発生する。
パースエラーは致命的なエラーで、コンパイルエラーに相当する。パースエラーが発生した場合、プログラムの実行を停止する。
<?php
class MyClass {
protected $name; /* protected変数を定義 */
function setName() {
$this->name = 'hogehoge'; /* protected変数 $name に 'hogehoge'を代入*/
}
function getName() {
$this->setName(); /* setName() メソッドを呼び出し */
echo $this->name;
}
}
$mycls = new MyClass(); /* クラスのインスタンスを作成 */
$mycls->getName();
/* echo $mycls->name; */
/* ↑コメントアウトしている行は、protected プロパティに外部からアクセスしているのでパースエラーが発生する
パースエラー(構文エラー)とはPHPがコードをパース(構文解釈)する段階で止まってしまうエラー */
?>![]() | 10日で使えるPHP | 未経験のサルでも分かるPHPの学習サイト 文系未経験、サルでも10日でPHPを使えるように内容を構成した独学向け学習サイト。不要な基礎はバッサリ切り捨て必要な基礎を十分に深堀した・・・ 続きを見る |