- 関数とは
- 変数とは
- PHPでクラスとは何か
- クラスと関数の違いとは
- PHPでのクラスの使い方とクラスの継承とは
- クラス継承(拡張)する、extends(拡張名)関数
- アクセス修飾子の、public、protectedで利用範囲を指定する
- Staticで、インスタンス無しでクラスにアクセスする
- クラスを「Interface(オブジェクト インターフェイス)」宣言するメリット
- Interface実装方法
- 異なるクラス、同じ関数名のfunction処理をインターフェイス1つで実行
- 1つのクラスで複数のインターフェイスを実装する多重継承とは
- 抽象化クラスとは
- Interfaceインターフェイスとabstract抽象化の使い分け
- 関数をabstract(抽象化)する方法
- 引数として使う無名クラスの使い方
関数とは
関数とは、あるデータを受け取り、定められた独自の処理を実行し、その結果を返す命令のことです。 「function xxxx {}」など処理命令が記載されたもの。変数とは
変数は、数値でも文字列でも入れることが出来る名前をつけたものです。 変数名は変数の名前(lang)は自由に決める事ができます。PHPでクラスとは何か
関数と変数を、パッケージにしたものを「クラス」といいます。「クラス」や「関数」などのプログラムの構造部分(処理の命令文)が記載されたものを「オブジェクト」といいます。オブジェクト指向とは
「オブジェクト」を、なるべく、まとめて「カプセル化」しておくことです。 例えば、このサイトのような記事ページを表示する場合、まずページのURLをチェックします。URLから該当のデータが保存されているidを取出します。データベースにアクセスします。データベースからデータを呼び出します。HTML用に整形します。ページにHTMLとして表示ます。この一連の流れの変数と関数を「クラス」にまとめてしまうと、わかりやすいですよね。クラスはこういった、まとまりにしたいものがあるときに利用します。クラスは、インスタンス生成をして実行
クラスで、パッケージ化しておき、「インスタンス生成」の後に「実行」するだけで終わるように設計していきます。クラスと関数の違いとは
function(引数)で処理を行い、retrnで返値を受け取れば、大抵のことが出来てしまいます。クラスを利用しなくても、関数と変数のみでブログ・サイトぐらいはつくることが出来ます。 クラスを作る意味があるのかも検討してみましょう。単純にページのURLを取得するだけなどの単純なプログラムなど、クラスにしないほうがいいプログラムもあります。クラス化のmeritは、クラス名でインスタンス変数から、クラス内の変数を呼出すので、クラスが違うなら同じ変数名を別のものとして使うことが出来る点です。nameやtextなどの変数名が被るような場合は、クラス化しておくのもよいと思います。 クラスは主に、データ容量が大きいものほど重宝します。プログラムが膨大になりがちな、ゲームを制作する場合は、このクラスが大活躍します。ある程度の関数がまとまったら、クラス化しておくと、プログラムの構造がすっきりみやすくなります。データ処理 | データ格納 | |
変数 | 処理は出来ない | データ格納は出来る |
関数 | 処理のみ可能 | データ格納が出来ない |
クラス | 処理が可能 | クラス内に変数をつくりデータ格納可能 |
無名クラス (使い捨てのクラス) | 処理のみ可能 | データ格納が出来ない |
PHPでのクラスの使い方とクラスの継承とは
クラスを制作していたところ、追加でクラスを付け足したい場合、親となるクラスに、拡張という形で「子クラスを継承」することができます。追加したいクラスに「”extends” と(拡張名したい元クラス名)」を記載をするだけです。クラス継承(拡張)する、extends(拡張名)関数
class (子クラスB) extends (親クラスA) {……} 別ファイルに記載のクラスも拡張する事ができる。親クラスに子クラスが自動で含まれる。classAを実行すると、子クラスのBが実行可能になる。 クラスについては、わかりやすくまとめた、以下の図を参照ください。アクセス修飾子の、public、protectedで利用範囲を指定する
どの範囲でアクセス可能にするかを、publicとprivateの利用範囲を定義できます。何も定義しなければ「purblic」扱いになります。global関数
クラス外にある変数を読込したい場合は、「global」宣言を行い変数を利用することができます。$_POSTはスーパーグローバル変数
<form>タグで使われる¥$_POST関数は、「スーパーグローバール変数」とよばれ、定義したり、ページを読込しなくても、どこからでも呼び出しすることができる変数です。formタグの「name=”値”」を自動的にキーとして配列としてデータが格納されています。PHP
//スーパーグローバル変数は9種類
//連想配列になっている。
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
スーパーグローバル関数の使い方
Staticで、インスタンス無しでクラスにアクセスする
JAVA言語で頻繁に利用するStaticはPHPでも使用できる。「static」は(静的)を意味する。クラスをStatic宣言するか、クラス内の関数にStatic宣言をしておくと、インスタンス無しでクラスへのアクセスが可能になる。 参考:PHP日本語マニュアル PHP日本語マニュアルがわかりやすいので、ここでは画像で補足します。以下の図を参照ください。PHPのclassでstaticを使う方法
PHPの変数(プロパティ)でstaticを使う方法
クラスを「Interface(オブジェクト インターフェイス)」宣言するメリット
処理方法や取得方法は全然違うけれど、関数処理後の結果が同じ形式になるものなら、「インターフェイス・オブジェクト」を検討してみる。インターフェイス導入の考え方
処理結果に合わせて、処理名を統一してわかりやすくする。PHP
//例
//関数名に合わせて実行を記載する
Class WordPress(){
function WordPress_Data(){
$post = $getData["post"];//投稿したブログ記事
return $post ;
}
//
$blog1 = new WordPress;//インスタンス生成
Class Gost_Blog{
function Gost_Contents_acsess(){
$blog = $input["content"];//投稿したブログ記事
return $post ;
}
}//
$blog2 = new Gost_Blog;//インスタンス生成
//ブログデータ取得処理実行には...
$blog1->WordPress_Data();
$blog2->Gost_Contents_acsess();
PHP
//例
//処理実行に合わせて関数名を統一する
Class WordPress{
function Blog(){
$post = $getData["post"];//投稿したブログ記事
return $post ;
}
//
$blog1 = new WordPress;//インスタンス生成
Class Gost_Blogo{
function Blog(){
$blog = $input["content"];//投稿したブログ記事
return $post ;
}
}//
$blog2 = new Gost_Blogo;//インスタンス生成
//ブログデータ取得処理実行
//すっきり、わかりやすい
$blog1->Blog();
$blog2->Blog();
Interfaceクラスからfunction処理名を統一する
Interface実装方法
implements 関数はことばの通り「実装」を意味します。Interfaceとimplements 関数をセットで利用します。class側に「implements(実装)+ (インターフェイス宣言の名称)」
インターフェイス側で public メソッドを呼出す宣言をする。 interface宣言をすると「クラス+ interface宣言」のクラスの外から、クラス内のfunctionを実行する。 インターフェイス内で宣言される全てのメソッドはpublicである必要がある。 インターフェイス側に記載されているfunctionは宣言だけの「抽象メソッド」で、処理のインスタンス(実行)を行うクラスが必須になる。インターフェイス側、function関数名を宣言するだけで、関数の実行の処理内容は記載することは出来ない。PHP
//インターフェイス定数は クラス定数 とまったく同じように動作する。
//以下のようにクラス内に同じfunction処理を記載する。
//つまり使おうか使わまいが、SetVariable、 GetHtmlが記載されていないとインターフェイスは動作しない。
// インターフェイスを宣言する
interface (インターフェイス名iTemplate)
{
public function SetVariable($name, $var);
public function GetHtml($template);
}//
//クラス名とimplementsで実装名を記載
class (クラス名Template) implements (実装インターフェイス名iTemplate){
public function SetVariable($name, $var){
}//end_functipn
public function getHtml($template){
}//end_functipn
}//end_class
異なるクラス、同じ関数名のfunction処理をインターフェイス1つで実行
異なるクラスで使用している同じ関数名をまとめて実行できる。PHP
//--------------------
//インターフェイス宣言
//-------------------
interface Fruits {
function applyPriceDown();
function getPrice();
//public function setPrice($price);
}
//-------------
//クラス定義
//------------
// りんごクラス
class Apple implements Fruits {
private $price = 1000;
function applyPriceDown() { // 常に2割引
$this->price = $this->price * 0.8;//8割の価格
}
function getPrice() {
return $this->price;
}
public function setPrice(){
return "りんご¥";
}
}//
// ぶどうクラス
class Grape implements Fruits {
private $price = 2000;
function applyPriceDown() {
if ('30' == date('d')) { // 30日なら半額
$this->price = $this->price / 2;//価格を2で割る
}
}
public function getPrice() {
return $this->price;
}
public function setPrice(){
return "ぶどう¥";
}
}//
//レモンクラス
class Lemon implements Fruits {
private $price = 500;
function applyPriceDown() {
//値引なし=処理なし
}
public function getPrice() {
return $this->price;
}
public function setPrice(){
return "レモン¥";
}
}//
//-------
//実行
//-------
$data1 = new Apple;//インスタンス化
$data2 = new Grape ;//インスタンス化
$data3 = new Lemon ;//インスタンス化
$data1->applyPriceDown();//割引額計算
$data2->applyPriceDown();
$data3->applyPriceDown();
//※ひとつの変数にまとめる場合インスタンス宣言はわかりやすい。
$nedan = array();
$nedan = array(
$data1->setPrice().$data1->getPrice(),//商品名:価格を取得
$data2->setPrice().$data2->getPrice(),
$data3->setPrice().$data3->getPrice(),
);
var_dump($nedan);
//実行結果
Apple:1000
Grape:2000
Lemon:500
1つのクラスで複数のインターフェイスを実装する多重継承とは
インスタンスで「多重継承」が可能な理由
※複数インスタンスでfunction関数名が重複していても、インスタンスではクラス”外部からのfunction処理へアクセスが可能ですよ”と宣言しているだけ。インスタンス(実行)されるのはクラス側なので、function処理は結局のところ1回しか行わないので、インスタンス側で重複した記載があってもエラーにならない。PHP
//----------------------
//インターフェイス宣言
//----------------------
interface hoge {
public function t1();
public function t2();
}
interface foo {
public function t2();
public function t3();
}
//-----------------------------
//インスタンス(実行)側クラス
// hogeとfooを多重継承してみる
//-----------------------------
class bar implements hoge, foo {
public function t1() {
echo "bar's t1()\n";
}
public function t2() {
echo "bar's t2()\n";
}
public function t3() {
echo "bar's t3()\n";
}
}//
$shori = new bar ;//インスタンス生成
//------------------------------
//インスタンス宣言で重複があっても実行されるのは1回
//------------------------------
$shori->t1(); //function処理
$shori->t2(); //function処理
$shori->t3(); //function処理
抽象化クラスとは
インターフェイスでも出てきた「抽象化クラス」とは、function処理を宣言しただけで、実際の処理の記述を記載していないクラスのこと。インターフェイス以外にも、抽象化クラスはインスタンス生成出来ない
抽象クラスとは、他のクラスで継承してもらうことを前提としたクラスで、抽象クラスをインスタンス生成することは出来ない。 インターフェイスと違い、「abstract(抽象)クラス」は、通常のクラス同様、プロパティやメソッドを実装可能。インスタンス化(実行)が出来ないので継承されるクラスは必須。インターフェイス interface (異なる2つのものを仲介の意味) | アブストラクト abstract (抽象的なという意味) |
---|---|
抽象化クラス (インターフェイス自体を、インスタンス実行出来ない) | 抽象化クラス (アブストラクト自体を、インスタンス実行出来ない) |
クラス側にimplements(実装)を記載 | クラス側にextends(拡張)を記載 |
インターフェイスの定義は、複数の異なるクラスの関数を記載できる | アブストラクトで定義を記載できるのは、単一のクラス内の関数のみ |
多重継承がOK 実行側クラスでの 複数インターフェイスを利用可 | 継承は単一のみ 実行側クラスは 1つのアブストラクトのみ |
インターフェイス宣言内の関数はクラス側に必須で記載。(無い場合はエラーになる) | アブストラクト宣言内の関数は、クラス側になくても問題ない。 |
全てpublic | public、protectedが利用可 |
関数名の定義のみ。 実装処理内容は記載NG | 関数名と合わせて処理記載もOK ※処理の実行は出来ない |
Interfaceインターフェイスとabstract抽象化の使い分け
Interfaceインターフェイスとabstract抽象化の使い分けは、宣言した関数(function)処理が必須でないとエラーが出る点。PHP
//------------------
//継承クラスで、親クラスが概要クラスとして定義された場合
//-------------------
//---------------------
//親クラス:概要クラス定義
//---------------------
abstract class AbstractClass
{
// 抽象メソッドでは、必須の引数だけを定義しています
// publicだけではなく、protected宣言も出来る
abstract protected function prefixName($name);
}//
//-------------------------------------
//クラス + 継承extendsするクラス名
//-------------------------------------
class ConcreteClass extends AbstractClass
{
// 子クラスでは、親のシグネチャにないオプション引数を再定義することもできる
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}//
//インスタンス生成
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
//上の例の出力は以下となります。
//
//Mr. Pacman
//Mrs. Pacwoman
関数をabstract(抽象化)する方法
abstract(抽象)はクラスだけではなく、関数(メソッド)でも利用出来る
PHP
abstract class BaseUser{
//通常のクラス同様、プロパティやメソッドを定義
public $age = 55;
public function showAge($age){
echo $age;
}
//抽象メソッド
abstract public function showName();
}
class User extends BaseUser{
function __construct(){
$this->showName();
$this->showAge($this->age);
}
public function showName(){
echo 'SATO ';
}
}
$user = new User();//SATO 55