CakePHP5入門【CakePHP5基礎編②】オブジェクト指向
B美
A子
前回の続きなら、「CakePHP」の話じゃないの?
B美
まぁ、急がば回れってやつね
C菜
今のプログラムって、ほとんどが「オブジェクト指向」らしいですよ~
B美
現在ほとんどのプログラム言語が「オブジェクト指向言語」になってるし、PHP言語も当然「オブジェクト指向言語」ってわけ
A子
B美
以前の文法編では「非オブジェクト指向」的な説明しかしてこなかったからね
それじゃ、まずは「オブジェクト」とは何か?
はい、C菜!
C菜
未確認飛行物体(UFO)って、「Unidentified Flying Object」の略ですからね~
B美
「物」とか「物体」って意味ね
「オブジェクト指向」では、一個の独立した「モノ」と考えるわ
これすなわち、複数の変数や関数を組み合わせたものを一つの独立した「モノ」と考えて、生産性や再利用性を高めるための仕組みってわけ
プログラムの「部品化」と言っても良いかな
A子
B美
「オブジェクト」という実体は、「クラス」という設計図から作られるの
C菜
B美
まぁ、難しく考えずに「オブジェクト指向」とはそういうものだ…と思っておけば良いわ
んで、重要なキーワードが三つあります
それが
・カプセル化
・継承(インヘリタンス)
・多態性(ポリモーフィズム)
A子
なんだか難しそうな話になってきそう…
B美
もちろん「継承」も使ってるんだけど、それはWebフレームワークのほうで使ってるだけで、我々が意識する必要は無いわ
C菜
「カプセル化」って何ですか~?
A子
B美
それはともかく…
「カプセル化」とは、変数(「フィールド」と呼びます)と関数(「メソッド」と呼びます)を一体化したものって意味ね
C菜
よく分からないです~
A子
あれとは違うの?
B美
あのときのコードを「クラス」という集合の中にパッケージングしたようなイメージかな
まぁ、実際にやってみれば分かるから、サンプルコードを打ち込んで実行確認してみましょう
「html」ディレクトリの中にある「test9.php」は以下のようになってると思うんだけど…
<?php
$test_file = 'test1.php'; $result = myfile_read($test_file); echo $result; function myfile_read($filename) { if (file_exists($filename)) { $info_file = file_get_contents($filename, false); $result = htmlspecialchars($info_file, ENT_QUOTES); return nl2br($result); } } ?> |
これを次のように書き換えてから「test11.php」というファイル名で保存してね
<?php
class MyFileRead { private $test_file = ''; function __construct($file) { $this->test_file = $file; } public function myfile_read() { if (file_exists($this->test_file)) { $info_file = file_get_contents($this->test_file, false); $result = htmlspecialchars($info_file, ENT_QUOTES); return nl2br($result); } } } $test = new MyFileRead('test1.php'); echo $test->myfile_read(); ?> |
↓
↓
B美
(クラス名は適当に「MyFileRead」としています)
そのクラスを「new」することで、「クラス」という設計図から「オブジェクト」という実体を生成して、それを$testという変数から参照しているの
(ちなみに、「オブジェクト」は「インスタンス」とも言います)
A子
B美
正確には「Field」と「Method」だけどね
あ、メソッドの中で「__construct」だけはちょっと特殊なメソッド(「コンストラクタ」と呼びます)で、「new」する(「インスタンス化」と呼びます)際に必ず呼び出されるメソッドなの
(左端は半角の「アンダースコア」が二文字連続します)
C菜
というか、「$this->test_file」なんて無いですよ~?
B美
(ちなみに、「->」は「アロー」と呼びます)
つまり、コンストラクタを呼び出した際に渡した文字列「test1.php」は、フィールド「$test_file」に格納されるってわけ
A子
B美
理屈が分かればそんなに難しくは無いでしょ?
C菜
「private」とか「public」って、何ですかぁ~?
B美
(「クラス」内で使うことができるだけ…ってこと)
逆に「public」が付いたものは、クラス外からアクセス可能ってわけ…
基本的に「フィールド」は「private」に、「メソッド」は「public」にすることが多いわね
(これを「フィールド隠蔽」と呼びます)
A子
B美
私がこの処理を部品化するにあたって、「フィールド」については「インスタンス化」するときだけ設定できるようにしたってわけ
(クラス外から「フィールド」の読み書きをしたければ、別途publicな「メソッド」を追加するようにしてね)
なお、隠蔽されている「フィールド」の値を読み出すメソッドのことを「Getter」、値を上書きするメソッドのことを「Setter」と呼びます
C菜
B美
だからこそ、こういうこともできる
<?php
class MyFileRead { private $test_file = ''; function __construct($file) { $this->test_file = $file; } public function myfile_read() { if (file_exists($this->test_file)) { $info_file = file_get_contents($this->test_file, false); $result = htmlspecialchars($info_file, ENT_QUOTES); return nl2br($result); } } } $test1 = new MyFileRead('test1.php'); $test2 = new MyFileRead('test2.php'); echo $test1->myfile_read()."<hr>".$test2->myfile_read(); ?> |
これを「test12.php」というファイル名で保存してね
(赤字が追加した箇所)
↓
C菜
ん~、「設計図(クラス)が一つあれば、いくつでも実体(オブジェクト)を作れる」…って、こういうことなんですね~
A子
これって、たしかにプログラムの「部品化」と言っても良い気がする
クラス内でどういう処理をしていようが関係ない、使い方さえ分かっていれば良い…ってことでしょ?
B美
大規模なアプリケーションシステムを構築する際、複数のクラスを組み合わせていくことによって、格段に生産性が高まるって寸法よ
だからこそ、Webフレームワークでは必ず「オブジェクト指向」を使っているのよね
A子
B美
でも、ほとんどのプログラマはそうしてるみたいだけどね
(CakePHPでもそうしています)
ま、とにかく、何となくでも「オブジェクト指向」という考え方が分かってもらえたかしら?
C菜
A子