【ワレコの講座】PHPのClassのコンストラクタとデストラクタ【4/10】

この記事は約11分で読めます。
スポンサーリンク

このところ、PHPの勉強中だ。

今日覚えたのはPHPのクラスの使い方の基本。

取り敢えず、覚えた内容を備忘録としてメモしておく。

スポンサーリンク
スポンサーリンク

PHPのクラスのコンストラクタとデストラクタ

PHPのクラスの基本形はこんなふうに書けるようだ。

<?php

   class MyPHPClass {  // クラスの定義
      public $name1='初期値1';
      // public $name2='初期値2'; // ここで宣言しても良いがしなくても良いみたい。
      function __construct() {
         $this->name1 = "別の値1";
         $this->name2 = "別の値2";
         echo '$name1 ->' . $this->name1  . "<- [今コンストラクタ]<br/>";
         echo '$name2 ->' . $this->name2  . "<- [今コンストラクタ]<br/>";
      }

      function __destruct() {
         print '$name1 ->' . $this->name1 . "<- [今デストラクタ]<br/>";
         print '$name2 ->' . $this->name2 . "<- [今デストラクタ]<br/>";
      }
   }

   // クラスを使う 
   $obj = new MyPHPClass();
   echo '$name1 ->' . $obj->name1 . '<- [変数を使ってみる]<br/>';
   echo '$name2 ->' . $obj->name2 . '<- [変数を使ってみる]<br/>';

?>

実行すると以下の通り。

$name1 ->別の値1<- [今コンストラクタ]
$name2 ->別の値2<- [今コンストラクタ]
$name1 ->別の値1<- [変数を使ってみる]
$name2 ->別の値2<- [変数を使ってみる]
$name1 ->別の値1<- [今デストラクタ]
$name2 ->別の値2<- [今デストラクタ]

PHPのクラスの使い方でワテが気づいた点

メンバ変数は以下の様にクラスの中で宣言して使うのが良いと思う。

例えば $name1 は初期値を代入して宣言している。

	public $name1='初期値1';
//	public $name2='初期値2';

でも、宣言せずにコンストラクタの中でいきなり使っても良いみたい($name2)。

	public $name1='初期値1';
//	public $name2='初期値2';   // ここで宣言しても良いがしなくても良いみたい。
	function __construct() {
		$this->name1 = "別の値1";
		$this->name2 = "別の値2";
		echo '$name1 ->' . $this->name1  . "<- [今コンストラクタ]<br/>";
		echo '$name2 ->' . $this->name2  . "<- [今コンストラクタ]<br/>";
	}

そうすると $name2 が宣言出来て、値も代入されて、その後は、$name1 と同様に使えるみたい。

でも、まあ、普通は $name1 のように冒頭で宣言しておくほうが分かり易いと思うので、ワテもそうするつもり。

デストラクタは使う場面は少ないようだ

PHPのデストラクタはPHP5から導入されたようだ。

Wikipediaによると

PHP 5.0.0 2004年7月13日にリリース。

なので、もう十年以上前の話か。

デストラクタ

void __destruct ( void )
PHP 5 では、C++ のような他のオブジェクト指向言語に似た概念のデストラクタが 導入されました。デストラクタメソッドは、 特定のオブジェクトを参照するリファレンスがひとつもなくなったときにコールされます。 あるいは、スクリプトの終了時にも順不同でコールされます。

引用元 http://php.net/manual/ja/language.oop5.decon.php

 

PHPでデストラクタを使う場面はどう言う時なのか調べてみたが、例えばスタックオーバーフローの以下の記事では、

Php Destructors
http://stackoverflow.com/questions/3566155/php-destructors

データベース接続をするPHPの場合に、セッションの終わりにデータベースとの接続を明示的に切断した場合などに利用すると良いなどの記述がある。

 

でもPHPでDB接続する場合なら、ワテが最近覚えた PDOと言うクラスを使って簡単に出来る。

MySQL への接続
<?php
   $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>

引用元 http://php.net/manual/ja/pdo.connections.php

接続を閉じる
<?php
   $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
   // ここで接続を使用します
   $sth = $dbh->query('SELECT * FROM foo');
   // 使用を終了したので、閉じます
   $sth = null;
   $dbh = null;
?>

引用元 http://php.net/manual/ja/pdo.connections.php

このように、データベースとの接続を閉じたい場合には、PODのインスタンス $dbh や query コマンドの結果を代入している $sth と言う変数に null を代入するだけで良いみたい。

PHPの歴史(Wikipediaより引用)

バージョン1.0が出たのが約22年前になるのか。

1995年と言うと、CERN で開発されたWWW(World Wide Web)の技術が世の中に普及し始めた頃だ。ワテもまだ小さかった。

NCSA Mosic やNetScape などもこの頃かな。Gopher とか言うのも有った気がする。

 

バージョン説明
PHP 1.01995年6月8日にリリース。ラスマス・ラードフが開発。C言語で書かれた CGI 用のツール集だった。ラスマスはそれらのツール群を PHP (Personal Home Page Tools) と名づけた。初期は Perl で書かれていたという言説を見かけるが、それは誤り。
PHP Version 2 (PHP/FI)1996年4月16日にリリース。 FI(Form Interpreter、SQLによるDBMSツール)が統合され、1997年に PHP/FI2.0 となる。フルスペルは「Personal Home Page Construction Kit/Form Interpreter」
PHP 3.01998年6月6日にリリース。 PHP/FI を元に、アンディ・ガトマンズとゼーブ・スラスキーによって PHP3 (PHP: Hypertext Preprocessor) が再度書き直された。
PHP 4.0.02000年5月22日にリリース。PHP3 を大幅に機能拡張。Zend Engine 導入。
PHP 4.1.02001年12月10日にリリース。スーパーグローバルが追加される。
PHP 4.2.02002年4月22日にリリース。register_globals の初期値が Off に変更される。
PHP 4.3.02002年12月27日にリリース。コマンドラインインタフェースの実装。
PHP 4.4.0

2005年7月11日にリリース。

2007年7月11日、PHP4のサポートを2007年12月31日をもって終了するという告知がなされた。重大なセキュリティに関する修正のみ、2008年8月8日まで継続され、その後すべてのサポートは終了した。

PHP 5.0.02004年7月13日にリリース。擬似的なオブジェクト指向がより一層強化されると共に、クラスライブラリとして SPL がサポートされた。 また、SQLite が標準装備されるようになった。Zend Engine 2.0 導入。
PHP 5.1.0 2005年11月24日にリリース。実行速度の改善、PDO エクステンションが追加される。
PHP 5.2.0 2006年11月2日にリリース。拡張モジュールに Filter(フィルタ)がデフォルトで追加される。
PHP 5.3.0 2009年6月30日にリリース。 以下の機能が追加になった[5]。
名前空間
遅延静的束縛
goto
クロージャ
ガベージコレクション
PHP 5.4.0 2012年3月1日にリリース。 以下の機能が追加になった[6]。
トレイト
配列の短縮構文
関数の返り値を配列として扱えるようになった
クロージャが $this を使えるようになった
PHP 5.5.02013年6月20日にリリース。 以下の機能が追加になった[7]。
ジェネレータ
finallyキーワード
foreach が list() に対応
empty() が任意の式に対応
array リテラルと string リテラルのデリファレンス
ClassName::class によるクラス名の解決
OPcache 拡張モジュールの追加
foreach が非スカラーのキーに対応
Apache 2.4 ハンドラが Windows に対応
GD 拡張モジュールの改良
パスワードハッシュ関数(password_get_info、password_hash、password_needs_rehash、password_verify)の追加 
PHP 5.6.0 2014年8月28日にリリース。主な新機能は以下の通り[8]。
定数やプロパティで式が使用可能に
可変個引数用の … 演算子導入
累乗演算子 ** 導入
phpdbg の導入
PHP 6 PHP 5.3の次のリリースとなるべく開発されていたバージョン。エンジンの内部処理がUTF-16に置き換えられる計画であったが、多くの問題に見舞われたことから2010年に開発を断念。5.4へと置き換えられた[9]。また5.6の次のバージョンが7とされたことから、欠番となった。
PHP 7.0 2015年12月3日にリリースされた[10]。Zend Engineの改善を行うPHPNG (PHP Next-Gen) プロジェクトの成果を取り入れており、データ構造の改善などにより、前バージョンのPHP 5.6と比べて25%から70%の性能改善が図られている。また言語仕様も大きく拡張されており、引数のタイプヒンティングにスカラー型が指定できるようになる(タイプヒンティングは5.1で導入されたが、クラスや配列など一部の型に限られていた)他、戻り値へのタイプヒンティングも導入されており、前年に発表されたHHVM用プログラミング言語Hackの影響が見受けられるものになっている。
PHP 7.1 2016年12月1日にリリースされた。型指定でスカラー型とNULLを許容するNULL許容型の追加、メソッドの返り値が無いことを示すvoidリターンタイプ、例外処理を書く際に一つのブロックで複数の例外タイプをキャッチするマルチキャッチなど、型を意識したコードを実装しやすくするための拡張が行われている。

引用元 https://ja.wikipedia.org/wiki/PHP:_Hypertext_Preprocessor#PHP_5

ワテがPHPをやり始めたのが2016年からなので、PHP5.6のあたりからだ。それ以前のPHPなんて殆ど知らない。名前を聞いた事がある程度。PHP研究所の親戚かと勘違いしていた。

まとめ

ワテの場合、Windows10に入れたVisual Studio 2015の環境で PHP をやっているのだが、有料のデバッガーを買おうかどうか検討中。

PHP Tools for Visual Studio 

  https://www.devsense.com/

が販売している。

どうしようかな。

でもPHPの開発環境で検索してみると、

PHPStorm

と言う製品が有名らしい。非常に高性能な統合開発環境(IDE)のようだ。

便利そうではあるが、ワテの場合 Visual Studio の統合開発環境を使っているので、簡単には他の開発環境には移りたくない。

両方を使うと言う選択肢もあるが、Visual Studio で作成したASP.NET のWEBサイトのデバッグでは Visual Studio は必須なので、他のIDEは使えないだろうなあ。C#とかはPHPStormでは扱えないと思うし。

と言う事で、PHPの勉強中のワテである。

今の時代は、子供にもPHPを教えるらしい。

プログラミング解説書の世界の赤川次郎かと思うくらい多作の山田祥寛さんだ。

 

スポンサーリンク
コメント募集

この記事に関して何か質問とか補足など有りましたら、このページ下部にあるコメント欄からお知らせ下さい。

MySQLPHP
スポンサーリンク
warekoをフォローする
スポンサーリンク
われこ われこ

コメント