自作関数、クラス

(ブログ記事の一覧は「こちら」)

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関数を使うと、以下の処理を自動で行ってくれます。

変換前 変換後
&(アンパサンド) &amp;
”(ダブルクォート) &quot;
’(シングルクォート) &#039; または &apos;
< &lt;
> &gt;

書式例は以下の通りです。

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>