Be an Engineer.

社会人からWEBエンジニアになった人間の備忘録的勉強記録

PHPのオブジェクト指向プログラミング(クラスの作り方)

最近独学でPHPの勉強をしています。
PHPの書籍は良書が少ないと言われているのを色々なところで目にしますが、そんな中で良書と呼ばれている「PHP 逆引きレシピ」を片手に(実際は片手で持てないぐらい分厚い本なのですが)、勉強を進めています。

そこで第5章のクラスとオブジェクトの勉強した内容をブログに綴ろうと思います。

クラスとは

  • オブジェクト:データとそのデータを操作するための手続きをひとまとめにしたもの。(オブジェクト = 変数 + 関数)
  • クラス:オブジェクトの定義(雛形)

オブジェクトが持つ変数をプロパティと呼び、関数をメソッドと呼ぶ。 PHPでは以下のように書く。

class クラス名
{
    // プロパティ
    private $プロパティ名;

    // メソッド
    public function メソッド名(引数)
    {
        // 処理を記述
    }
}

”public”等はアクセス修飾子と呼び、プロパティやメソッドへのアクセス権を表す。 アクセス修飾子を省略するとpublicを明示的に指定したのと同じ意味になる。(ただしコードを明瞭にするために省略せずに記述すべし)

アクセス修飾子まとめ

  • public:外部からでもアクセス可能
  • protected:定義するクラス内とそのクラスを継承したクラスからアクセス可能
  • private:定義するクラス内のみからアクセス可能

(クラスを作る例: fileinfo.php

<?php
class FileInfo
{
     private $retCode;

     //改行コードの数を調べるメソッド
     public function readFile($file)
     {
          $this->retCode['CRLF'] = 0;
          $this->retCode['LF']   = 0;

          $fp = fopen($file, 'r');
          // is_resourceは評価する変数がリソース型であるかどうかを返す(true or false)
          // リソースは特別な変数であり、外部リソースへのリファレンスを保持している
          if (! is_resource($fp)) {
               die('ファイルを開けませんでした');
          }

          while (($line = fgets($fp)) !== false) {
               if (preg_match('/\r\n\z/', $line)) {
                    $this->retCode['CRLF']++;
               } else {
                    $this->retCode['LF']++;
               }
          }
          fclose($fp);
     }

     // 改行コードの数を返すメソッド
     public function getRetCode()
     {
          if ($this->retCode['CRLF'] == 0 && $this->retCode['LF'] == 0) {
               return '';
          } elseif ($this->retCode['CRLF'] == 0) {
               return 'LF';
          } elseif ($this->retCode['LF'] == 0) {
               return 'CRLF';
          } else {
               return 'CRLF & LF';
          }
     }
}

クラスを使う

クラスを利用するには、new演算子でオブジェクトを作成(インスタンス化)する必要がある。
クラスから生成されたオブジェクトを「インスタンス」と呼び、クラスからインスタンスを生成することを「インスタンス化」(実体化)と呼ぶ。

(上記の例であれば、class FileInfoをインスタンス化することによって、readFileやgetRetCodeメソッドが使用可能となる)

1つのクラスからインスタンスはいくつでも生成でき、生成されたオブジェクトはそれぞれがプロパティを持つことになる。

(FileInfoクラスを使用する例: sample.php

<?php
require_once '/path/to/fileinfo.php';

$fileinfo = new FileInfo();
$fileinfo->readFile('./sample.php');

echo '改行コードは「'.h($fileinfo->getRetCode()).'」です。';
?>

今日はここまで。