PHP5のクラス定義とオブジェクトのおさらい
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
PHP4からPHP5になって、PHPがJava化しているとか言われますけど、オブジェクト指向が強まったのも理由かもしれません。
CakePHPの勉強をはじめたことですし、PHP5のクラス定義をおさらいする個人メモ。
クラスの利用
<?php
class Hoge {
var $name = '太郎';
function get_name() {
return $this->name;
}
}
// オブジェクトは参照渡し
$a = new Hoge;
$b = $a;
$b->name = '次郎';
echo $a->get_name() . "<br />";
// オブジェクトのコピー
$c = new Hoge;
$d = clone $c;
$d->name = '次郎';
echo $c->get_name();
?>
以下、上記ソースの実行結果。
name; } } // オブジェクトは参照渡し $a = new Hoge; $b = $a; $b->name = '次郎'; echo $a->get_name() . "
"; // オブジェクトのコピー $c = new Hoge; $d = clone $c; $d->name = '次郎'; echo $c->get_name(); ?>
このブログのPHPのバージョンは、PHP5です。
まず、クラスの利用を確認してみると・・・
単にインスタンス化したオブジェクトを、「$b = $a;」と代入すると、参照渡しになっていることを確認できます。
オブジェクトをコピーして別物として扱うには、「$d = clone $c;」とclone演算子を使う。
じゃ、次にクラス定義のほう。
オブジェクト指向は、利用よりもクラス定義のほうがはるかに難しいし、センスが要りますね。
メソッド、プロパティの宣言
static宣言 (スタティックメソッド、スタティックプロパティ)
<?php
class Static_Hoge {
static function get_name() {
return '太郎';
}
}
$a = new Static_Hoge;
echo $a->get_name() . '<br />';
echo Static_Hoge::get_name();
?>
スタティックメソッド(静的メソッド)やスタティックプロパティ(静的プロパティ)は、共通して使うようなメソッド、プロパティをクラス内に定義する場合にstaticで宣言する。
new演算子でオブジェクトを生成しても呼び出せるけど、オブジェクトを生成せず「Static_Hoge::get_name();」と「クラス名::メソッド名」とするだけで呼び出せます。
また、クラス名やメソッド名の頭に、「final」キーワードを付けると、サブクラス(子クラス)での継承、オーバーライドを制限する。
プロパティ、メソッドのアクセス制限
public、private、protectedなどのアクセス修飾子がPHP5から使えるようになっています。
ちょっと簡単なクラスと継承を書いてテスト。
<?php
// アクセス制限テストの親クラス
class Access_Hoge {
public $tarou = '太郎';
private $jirou = '次郎';
protected $kojirou = '小次郎';
}
// 継承クラス
class Child_Access_Hoge extends Access_Hoge {
function tarou() {
// publicはどこからでもアクセス可能
return $this->tarou;
}
function jirou() {
// privateはアクセス不可能
return $this->jirou;
}
function kojirou() {
// protectedは子クラスのメソッドからアクセス可能
return $this->kojirou;
}
}
// オブジェクト生成してアクセスできるか実験
$a = new Access_Hoge;
echo $a->tarou . '<br />';
echo $a->jirou . '<br />'; // $jirouはprivate宣言なのでエラー
echo $a->kojirou . '<br />'; // $kojirouはprotected宣言なのでエラー
// サブクラスで実験
$b = new Child_Access_Hoge;
echo $b->tarou() . '<br />';
echo $b->jirou() . '<br />'; // $jirouは親クラスでprivate宣言なのでエラー
echo $b->kojirou() . '<br />'; // $kojirouは親クラスでprotected宣言なのでアクセスできる
?>
publicの場合、クラス外部・内部のどこからでもアクセス可能です。
privateの場合、それを宣言しているクラス内部からのみアクセス可能、protectedの場合、定義クラスおよびその子クラスからアクセス可能です。
クラス内での定数の定義
あと、クラス定義内でconstを頭につけると、define関数みたいな定数の定義ができる
staticとあわせて、const宣言のプロパティへのアクセスは、以下の通り。
<?php
class Const_Hoge {
const MYNAME = '変なおじさん';
static $myname = 'たけちゃんまん';
}
echo Const_Hoge::MYNAME . '<br>';
echo Const_Hoge::$myname . '<br>';
?>
実行結果。
'; echo Const_Hoge::$myname . '
'; ?>
interface(インターフェース)とabstract(抽象クラス・抽象メソッド)
<?php
interface Printout {
// メソッド宣言のみで実装しない
public function printOut();
}
class Img_Print implements Printout {
// interfaceで宣言したメソッドの実装
function printOut() {
return '画像を印刷中です';
}
}
?>
まず、interfaceで実装すべきメソッドを宣言だけしておき、実装はしません。
その後、implements(実装)するclassの中で、interfaceで宣言したメソッドを実装する。
こうしておけば、定義する(またはすべき)メソッドをinterface内で一覧確認できる効果があるそうです。
また、interfaceと似ている機能で、abstractという抽象クラス・抽象メソッドを宣言するキーワードもあります。
<?php
abstract class Component {
abstract function printOut();
public function info() {
echo 'コンポーネントです。';
}
}
class ImgComponent extends Component {
function printOut() {
return '高画質の写真を表示';
}
}
?>
こちらは、abstract class と抽象クラスを定義し、その中のメソッドもabstractで定義する。
interfaceと違う点は、抽象クラス(abstract宣言のクラス)の中で、関数の実装も行える点。
コンストラクタとデストラクタ
PHP4までは、コンストラクタはクラス名と同じ名前で宣言していたが、
クラス内で「function __construct」で宣言できるようになった。
これにより、親クラスの名前を何回も書く必要がなくなります。子クラスから親クラスのコンストラクタを呼び出す場合・・・
「parent::_construct()」で呼び出せるので、メンテナンス性が高まります。
デストラクタの宣言も、「function __destruct()」で可能になった。
以上、PHP5のクラス定義とオブジェクトについてでした。
CakePHPのソースを読み解くには、これらの理解がないと無理っぽかったんで復習してみました。
- - 関連記事 -
- strpos() や strcmp() など間違えやすいif文での判定
- htmlentities() と htmlspecialchars() の違い
- PHPの内部エンコードと出力文字コード、スクリプト文字コード
- PHPのデバッグ・xdebugをxamppで有効にする
- CakePHPの日本語対応、国際化
- コマンドラインでPHPが起動できない
- 直接ファイルが実行されたときだけ起動するスクリプト
- ディレクトリを探索してリンク一覧表示
- PHPとRubyのコードの書き方を比較
- コメントアウトの使い分けと、/*** ~ ***/とか// — を単語登録
- PHPでvar_dump()を使ったお手軽デバッグコード
- プログラミング練習問題をPHPで解いてみた
- CakePHPはMVCかつフルスタックのフレームワーク
- フレームワークCakePHPにチャレンジ
- sort・asort・ksort 配列を並べ替える関数
- foreach構文
- PHPの配列
- strcmp関数
- strcasecmp関数
- PHPヒアドキュメント