自作関数、クラス
(ブログ記事の一覧は「こちら」)
PHPで自作関数と自作クラスを作成して利用する方法を学びましょう。
ここで学ぶこと
- 自作関数の使い方
- htmlspecialchars関数(エスケープ処理)
- 自作クラスの使い方
参考:
クラスの基礎(PHPマニュアル)
オブジェクトの継承(PHPマニュアル)
例題1
以下の自作関数の例について、実際に動作させて確認していきましょう。
自作関数の構文は以下になります。
<?php function 関数名(引数) { // 一連の処理 // 必要であれば戻り値 (return $ret;) } ?>
まずはシンプルな例です。
<?php function addText($str) { echo "私は" . $str . "が得意です。<br>"; } ?> <html> <head> <meta charset="UTF-8"> </head> <body> <?php addText("日本語"); addText("プログラミング"); ?> </body> </html>
引数は複数個の定義ができます。
<?php function calcAdd($int1, $int2) { $sum = $int1 + $int2; return $sum; } ?> <html> <head> <meta charset="UTF-8"> </head> <body> <?php $int1 = 8; $int2 = 3; $result = calcAdd($int1, $int2); echo $result; ?> </body> </html>
セキュリティの観点から、特定の文字を変換する(エスケープ処理)必要が出てきます。 htmlspecialchars関数を使うと、以下の処理を自動で行ってくれます。
変換前 | 変換後 |
---|---|
&(アンパサンド) | & |
”(ダブルクォート) | " |
’(シングルクォート) | ' または ' |
< | < |
> | > |
書式例は以下の通りです。
htmlspecialchars(文字列の変数, ENT_QUOTES, "UTF-8");
詳しくはマニュアルを参考にしてください。
以下のような自作関数を用意すると便利です。
<?php function escapeHtml($word) { return htmlspecialchars($word, ENT_QUOTES, 'UTF-8'); } ?> <html> <head> <meta charset="UTF-8"> </head> <body> <?php $word = '<h1>エスケープ処理のテスト</h1>'; echo $word; echo escapeHtml($word); ?> </body> </html>
例題2
次に、自作クラスの例について、実際に動作させて確認していきましょう。
例題2-1
まずは簡単なクラスを作成してみましょう。
下記のコードを「sample_class_public.php」として作成してください。
<?php class User { // 変数(プロパティ)の宣言 public $name = ''; public $hobby = ''; // 関数(メソッド)の宣言 public function echoHello() { echo $this->name . "さん、こんにちは!<br>"; } public function echoHobby() { echo $this->name . "さんの趣味は" . $this->hobby . "です。<br>"; } } ?>
次に、下記のコードを「sample_call_class_public.php」として作成してください。
<?php require_once('./sample_class_public.php'); ?> <html> <head> <meta charset="UTF-8"> </head> <body> <?php $user = new User(); $user->name = '田中'; $user->hobby = 'サッカー'; $user->echoHello(); $user->echoHobby(); ?> </body> </html>
実行、確認
それぞれのPHPファイルをサーバーの同じ場所に置き、「sample_call_class_public.php」を実行します。
クラス内の関数が正しく実行できていることを確認してください。
例題2-2
上記の例題は、簡単な例にするため、クラスの変数を public で定義しています。
通常はクラスの変数を private で定義します。private に書き換えたものと比較してみましょう。
下記のコードを「sample_class_private.php」として作成してください。
<?php class User { // 変数(プロパティ)の宣言 private $name = ""; private $hobby = ""; // 関数(メソッド)の宣言 public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setHobby($hobby) { $this->hobby = $hobby; } public function getHobby() { return $this->hobby; } public function echoHello() { echo $this->name . "さん、こんにちは!<br>"; } public function echoHobby() { echo $this->name . "さんの趣味は" . $this->hobby . "です。<br>"; } } ?>
外部から変数を呼び出すために、setter(セッター)とgetter(ゲッター)と呼ばれる関数(メソッド)を新たに定義する必要があります。
次に、下記のコードを「sample_call_class_private.php」として作成してください。
<?php require_once('./sample_class_private.php'); ?> <html> <head> <meta charset="UTF-8"> </head> <body> <?php $user = new User(); $user->setName('田中'); $user->setHobby('サッカー'); $user->echoHello(); $user->echoHobby(); ?> </body> </html>
変数 $name, $hobby は(private のため)直接呼び出すことはできなくなり、setName(), setHobby() メソッドを使う必要があります。(このことを「カプセル化」と言います)
実行、確認
それぞれのPHPファイルをサーバーの同じ場所に置き、「sample_call_class_private.php」を実行します。
クラス内の関数が正しく実行できていることを確認してください。
課題1
以下の自作関数を作成してください。
問1. 指定した範囲の数値($int1 〜 $int2)の奇数のみの合計を計算する自作関数
<?php function calcSumOdd($int1, $int2) { // ここに処理を追加 return $sum; } echo calcSumOdd(1, 100); echo calcSumOdd(1, 1000); ?>
問2. 文字列 $word に対して、ある文字 $char が見つかるのが何文字目かの数字を返す自作関数(ただし、文字が見つからない場合は「-1」を返す)
<?php function findCharFromWord($word, $char) { // ここに処理を追加 return $ret; } echo findCharFromWord("おはようございます", "よ"); echo findCharFromWord("アプリ制作と卒業制作", "制"); echo findCharFromWord("こんにちは", "よ"); ?>
例:echo findCharFromWord("おはようございます", "よ"); の場合、結果は「2」となる。
課題2
例題2-2のクラス User に対して、以下を参考に、継承したクラス UserDetail を追加してください。
スーパークラス User とサブクラス UserDetail を定義した「sample_class_extends.php」
<?php // スーパークラス class User { (省略) } // サブクラス class UserDetail extends User { // 変数(プロパティ)の宣言 private $age = ""; // 年齢 private $gender = ""; // 性別(男、女) // 関数(メソッド)のオーバーライド public function echoHello() { // ○○さん、こんにちは!○○さんは□□歳ですね? } public function echoHobby() { // ○○さんは(性別が)△だから◇◇◇◇が好きなのですね? } } ?>
[ヒント]
まず、setter(セッター)とgetter(ゲッター)を追加します。
クラス UserDetail を呼び出す「sample_call_class_extends.php」
<?php require_once('./sample_class_extends.php'); ?> <html> <head> <meta charset="UTF-8"> </head> <body> <?php $userDetail = new UserDetail(); // 以下を記述 ?> </body> </html>