PHP OOLib の使い方

[Home] | [Download Now!]


はじめに

OOLib は PHP7 以上で動作する PHP ライブラリである。

ファイルは、OOLib0.php, OOLib1.php, MySQL.php に分かれている。OOLib0.php は ファイルとディレクトリを扱うクラス File と Directory からなる。このクラスはウェブに依存しないので、CLI でも動作する。

一方、OOLib1.php はウェブに関連する WebPage クラスとタグ作成関数からなる。

MySQL.php は MySQLi をベースにしており、MySQL へのアクセスを簡単に行うためのクラスを定義している。

すべてのクラス、関数は OOPHPLib 名前空間を使用する。


 

基本的な使い方


ウェブページ PHP ファイルの基本例

<?php
# 画像フォルダ用 PHP アプリケーション
include "OOLib1.php";
include "MySQL.php";  # MySQL を使用しなければ不要。

#
#  Index ページ
#  =============
class IndexPage extends OOPHPLib\WebPage {

  #
  # コンストラクタ
  #   filePath はテンプレートファイルのファイル名 
  #   (フルパスを指定しない場合は、php ファイルと同じ場所にあること)
  public function __construct(string $filePath = null) {
    parent::__construct($filePath);  # テンプレートと AppConf.ini ファイルを読み込む。

    $this->v['title'] = "IndexPage";
    $this->v['message'] = "OK";

    # 引数があるか
    if (isset($_REQUEST('param')) {
      # 引数による処理
      // ...
    }
    else {
      # デフォルトの処理
      // ...
    }
  }

}

# IndexPage をインスタンス化して HTML をクライアントへ送信する。
$page = new IndexPage('index.template');
$page->echo();

ウェブページテンプレートファイルの基本例

<!DOCTYPE html>
<head>
<meta charset="utf-8" />
<title>(*title*)</title>
</head>

<body>
<h1 style="text-align:center;">(*title*)</h1>
<br />
<p>(*message*)</p>


</body>
</html>

 

OOLib0.php

OOPHPLib\File クラス

宣言説明
public static function exists(string $filePath): boolファイルの存在確認。存在するときは true を返す。
public static function getLength(string $filePath) : intファイルサイズを返す。(2GBまで)
public static function getMode(string $filePath) : stringファイルモードを8進数文字列で得る。
public static function setMode(string $filePath, string $mode) : voidファイルモードを変更する。
public static function isDirectory(string $filePath) : boolパスがディレクトリなら true を返す。
public static function isLink(string $filePath) : boolパスがシンボリックリンクなら true を返す。
public static function isReadOnly(string $filePath) : boolファイルが書き込み禁止なら true を返す。
public static function getLastModified(string $filePath) : stringファイルの最終更新日時を得る。
public static function getUserName(string $filePath) : stringファイルの所有者を得る。
public static function getGroupName(string $filePath) : stringファイルの所有者グループを得る。
public static function readAllText(string $filePath) : stringファイルを読み込んで文字列として返す。
public static function writeAllText(string $filePath, string $str) : void文字列をファイルに書く。
public static function writeAllLines(string $filePath, array $sa) : void文字列の配列をファイルに書く。
public static function getPhysicalPath(string $path) : string物理パスを得る。
public static function getExtension(string $path) : string拡張子を返す。("." を含まない)
public static function getFileName(string $path) : stringファイル名を返す。(拡張子を含む)
public static function getFileNameBody(string $path) : stringファイル名を返す。(拡張子を含まない)
public static function getDirectory(string $path) : stringディレクトリを返す。
public static function delete(string $path) : boolファイルを削除する。
public static function move(string $srcpath, $destpath) : boolファイルを移動する。
public static function copy(string $srcpath, $destpath) : boolファイルをコピーする。
public static function createSymlink($target, $name) : boolシンボリックリンクを作成する。

OOPHPLib\Directory クラス

宣言説明
public static function getCurrentDirectory() : string現在のディレクトリを返す。
public static function getLastModified(string $dirPath) : stringディレクトリの更新日時を得る。
public static function setCurrentDirectory(string $dirPath) : void現在のディレクトリを変更する。
public static function exists(string $dirPath) : boolディレクトリが存在するかチェックする。
public static function createDirectory(string $dirPath) : voidディレクトリを作成する。
public static function removeDirectory(string $dirPath) : voidディレクトリを削除する。
public static function getFiles($dirPath, string $filter = "", bool $full=false) : arrayファイル一覧を得る。
public static function getSubDirectories($dirPath, $full=false) : arrayサブディレクトリ一覧を得る。
public function getParentPath(string $dirPath) : string親のディレクトリを返す。

 

OOLib1.php

OOPHPLib\WebPage クラス

宣言説明
protected $htmコンストラクタのパラメータ filePath で指定したファイルの内容を保持する。
public $vhtm に含まれる特殊タグ (*キー*) をHTML作成時に値で置き換えるためのキー:値の連想配列。
public $confreadIniFile メソッドで読み込んだ INI ファイルの内容を連想配列に変換したもの。
public function __construct(string $filePath)コンストラクタ。filePath はテンプレートファイルのパス名。
public function toString() : stringHTML 文字列を返す。
public function echo()HTML を出力する。
public function isPostback()パラメータがあれば true, なければ false
public static function sendHttpHeader(string $header) : void生のヘッダーを送る。
public static function redirect(string $loc) : voidリダイレクト
public static function sendImageHeader(string $img) 画像ヘッダーを送る。
public static function readIniFile(string $inifile) INI ファイルを読む。

テンプレートファイルの説明

テンプレートファイルは HTML を作成するベースとなるファイルで、<!DOCTYPE html> で始まり、</html> で終わるものとする。テンプレートファイルの内容のうち、(*キー*) の部分は値で置き換えられる。

サンプル

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>(*title*)</title>
</head>

<body>
<h1>(*title*)<h1>

</body>
</html>
    

このサンプルでキー"title"がフィールド v に存在すれば、v['title'] により (*title*) が置換される。


OOPHPLib\関数

宣言説明
function tag($tagname, $value, $style=null) : stringタグを作る。
function anchor($href, $text, $target="")
function HtmlTableRow(array $arr, string $tr = null, string $td = null) : stringHTML テーブル行
function HtmlTable(array $arr, string $tab = null, string $td = null, string $th = null) : stringHTMLテーブルを作る。
function HtmlList(array $arr, bool $ol = false, string $style1 = null, string $style2 = null)function HtmlDefine(array $titles, array $defs, string $style1 = null, string $style2 = null) : string

 

MySQL.php

MySQL クラス

宣言説明
public $host;接続先ホストの URL または IP アドレス
public $uid;ユーザID
public $pwd;パスワード
public $db;接続先のデータベース名
public $error;最後に発生したエラーのエラーコード
public function __construct(string $inifile='MySQLConnect.ini')コンストラクタ。inifile の内容が有効なら MySQL に接続する。
function __destruct()MySQL に 接続していたら接続を切る。
public function open(string $db)db で指定したデータベースに接続する。host, uid, pwd に有効な値を事前に設定しておく必要がある。
public function close()接続を閉じる。
public function query(string $sql) : arraySELECT クエリーを行う。
public function getValue(string $sql)1つの値を返す SELECT クエリーを行う。
public function execute(string $sql) : bool非 SELECT クエリーを行う。
public function getLastError()最後に発生したエラーのエラーメッセージを返す。

INI ファイルの例

host=localhost
uid=root
pwd=????????
db=apps
    

 

サンプル

<?php
include "OOLib1.php";
include "MySQL.php";

class KeyListPage extends OOPHPLib\WebPage {
  private $form1;
  private $form2;
  private $filterBucket;
  private $filterTilte;
  private $filterTag;

  // コンストラクタ
  public function __construct(string $filePath = null) {
    parent::__construct($filePath);
    // Form1 を読み込む。
    $this->form1 = OOPHPLib\File::readAllText('Form1.html');
    $this->v['form1'] = $this->form1;
    // Form2 を読み込む。
    $this->form2 = OOPHPLib\File::readAllText('Form2.html');
    $this->v['form2'] = $this->form2;
    $this->v['message'] = '';
    // パラメータがあるか?
    if (isset($_REQUEST['request'])) {
      $request = $_REQUEST['request'];
      if ($request == 'filter') {
        // 表示条件に基づいてキー一覧を表示
        $this->v['list'] = $this->listKeys($_POST['bucket'], $_POST['title'], $_POST['tag']);
      }
      else if ($request == 'add') {
        // 新規登録
        $this->v['message'] = $this->addNew();
        $this->v['list'] = $this->listKeys();
      }
      else if ($request == 'delete') {
        // キーを削除
        $this->v['message'] = $this->deleteItem();
        $this->v['list'] = $this->listKeys();
      }
      else {
        // エラー
        $this->v['message'] = '不正なコマンドです。';
        $this->v['list'] = $this->listKeys();
      }
    }
    else {
      // キー一覧を表示
      $this->v['list'] = $this->listKeys();
    }
  }

  // 登録されているキー一覧を表示する。
  private function listKeys($bucket='', $title='', $tag='') {
    $strbuff = '<p style="text-align:center;margin-top:40px;font-size:larger;color:blue;">キー一覧</p>';
    $strbuff .= '<table style="width:100%;"><tr><th>Id</th><th>バケット</th><th>キー</th><th>タイトル</th><th>タグ</th><th>情報</th><th>削除</th></tr>';
    $conn = new OOPHPLib\MySQL('AppConf.ini');
    $sql = "SELECT * FROM keylist";
    $dataTable = $conn->query($sql);
    if (count($dataTable) > 0) {
      foreach ($dataTable as $row) {
        $strbuff .= '<tr>';
        $strbuff .= '<td>'.$row['id'].'</td>';
        $strbuff .= '<td>'.$row['bucket'].'</td>';
        $strbuff .= '<td>'.$row['key'].'</td>';
        $strbuff .= '<td>'.$row['title'].'</td>';
        if (isset(row['tag'])) {
          $strbuff .= '<td>'.$row['tag'].'</td>';
        }
        else {
          $strbuff .= '<td></td>';
        }
        if (isset($row['info'])) {
          $strbuff .= '<td>'.$row['info'].'</td>';
        }
        else {
          $strbuff .= '<td></td>';
        }
        $strbuff .= '<td><a href="index.php?request=delete&id='.$row['id'].'">Del</a></td>';
        $strbuff .= '</tr>';
      }
      $strbuff .= '</table>';
    }
    else {
      $strbuff = '<p>データがありません。</p>';
    }
    return $strbuff;
  }

  // 新規追加
  private function addNew() {
    $msg = '';
    $folder = '0';
    try {
      if (isset($_POST['region'])) {
        $region = $_POST['region'];
      }
      else {
        return 'NG No region.';
      }
      if (isset($_POST['bucket'])) {
        $bucket = $_POST['bucket'];
      }
      else {
        return 'NG No bucket.';
      }
      if (isset($_POST['folder'])) {
        $folder = '1';
      }
      $tag = '';
      if (isset($_POST['tag']) && strlen($_POST['tag']) > 1) {
        $tag = substr($_POST['tag'], 0, 1);
      }
      if (isset($_POST['title'])) {
        $title = $_POST['title'];
      }
      else {
        $title = '';
      }
      if (isset($_POST['key'])) {
        $key = $_POST['key'];
      }
      else {
        $key = '';
      }
      if (isset($_POST['info'])) {
        $info = $_POST['info'];
      }
      else {
        $info = '';
      }

      $SQLINSERT = "INSERT INTO keylist(`region`,`bucket`,`key`,`title`,`folder`,`tag`,`info`) VALUES('%s','%s','%s','%s','%s','%s','%s')";
      $sql = sprintf($SQLINSERT, $region, $bucket, $key, $title, $folder, $tag, $info);
      $conn = new OOPHPLib\MySQL('AppConf.ini');
      $conn->execute($sql);
      $conn->close();
      $msg = 'OK '.$sql;
    }
    catch (Exception $ex) {
      $msg = 'NG ' . $ex->getMessage();
    }
    return $msg;
  }

  // 削除
  private function deleteItem() {
    $msg = '';
    if (!isset($_GET['id'])) {
      $msg = 'NG: No id';
      return $msg;
    }
    $sql = "DELETE FROM keylist WHERE id=" . $_GET['id'];
    try {
      $conn = new OOPHPLib\MySQL('AppConf.ini');
      $conn->execute($sql);
      $conn->close();
      $msg = 'OK Id '.$_GET['id'].' deleted.';
    }
    catch (Exception $ex) {
      $msg = 'NG ' . $ex->getMessage();
    }
    return $msg;
  }
}


$p = new KeyListPage('KEYLIST.html');
$p->echo();
?>

テンプレート:KEYLIST.html

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8" />
 <title>AWS S3 : 場所の管理</title>
 <script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous">
 </script>
 <style>
	h1 {
	  text-align:center;
	  color:midnightblue;
	  padding:15px;
	  border:solid 20px silver;;
	  border-radius: 0.5em;
	  background-color:#f0f0f0;
	}

	h2 {
	  color: darkcyan;
	  padding:4px;
	}

	a:link, a:visited {
	  color:blue;
	  text-decoration:none;
	}

	th {
	  border-bottom:solid thin gray;
	  border-top:solid thin gray;
	  padding: 3px;
	}

	td {
	  border-bottom:solid thin silver;
	  padding: 3px;
	  font-size:small;
	}

	td.tdleft {
	  font-weight:bold;
	  border-right:solid thin silver;
	}

	pre {
	  word-break:break-all;
	}

 </style>
</head>



<body style="margin-left:4%;margin-right:4%;">
 <header>
  <h1><img src="AWS.png" /> AWS S3 場所の管理</h1>
  <p style="text-align:center;"><a href="/">HOME</a></p>
 </header>

 <!-- 新規登録用フォーム -->
 <div>
  (*form1*)
 </div>

 <!-- フィルタ用フォーム -->
 <div style="border:solid thin silver;padding:5px;background-color:aliceblue;">
  <p style="margin-left:30px;">表示条件</p>
  (*form2*)
 </div>
 <!-- メッセージ -->
 <div style="margin-left:20px; margin-top:15px;">
  (*message*)
 </div>

 <!-- キー一覧 -->
 <div>
  (*list*)
 </div>

<p> </p>
<p> </p>
</body>

</html>

テンプレート:Form1.html

 <form method="POST" action="index.php" style="padding:8px;border:solid thin gray;background-color:whitesmoke;margin-bottom:30px;">
  <!-- フォームのリクエスト種別 -->
  <input type="hidden" name="request" value="add" />
  <!-- フォームの内容 -->
  <table style="border-width:0px;">
    <tr><td colspan="2" style="font-size:medium;text-align:center;">キーの追加</td></tr>
    <tr><td style="border-width:0px;width:20%;">region</td><td style="border-width:0px;">
     <select name="region">
       <option>us-west-2</option>
       <option>ap-northeast-1</option>
       <option>us-west-1</option>
       <option>us-east-1</option>
     </select>
    </td></tr>
    <tr><td style="border-width:0px;">bucket</td><td style="border-width:0px;">
      <input type="text" name="bucket" size="50" />
    </td></tr>
    <tr><td style="border-width:0px;">key</td><td style="border-width:0px;">
      <input type="text" name="key" size="100" />
    </td></tr>
    <tr><td style="border-width:0px;">title</td><td style="border-width:0px;">
      <input type="text" name="title" size="100" />
    </td></tr>
    <tr><td style="border-width:0px;">folder</td><td style="border-width:0px;">
      <input type="checkbox" name="folder" />
    </td></tr>
    <tr><td style="border-width:0px;">tag</td><td style="border-width:0px;">
      <input type="text" name="tag" size="1" />
    </td></tr>
    <tr><td style="border-width:0px;">info</td><td style="border-width:0px;">
      <input type="text" name="info" size="100" />
    </td></tr>
    <tr><td style="border-width:0px;"></td><td style="border-width:0px;"><input type="submit" value="送信" /><input type="button" value="リセット" /></td></tr>
  </table>
 </form>

テンプレート:Form2.html

<form method="POST" action="index.php" style="margin-bottom:30px;">
  <!-- フォームのリクエスト種別 -->
  <input type="hidden" name="request" value="filter" />
  <!-- フォームの内容 -->
  bucket: <input type="text" name="bucket" size="25" /> 
  title: <input type="text" name="title" size="50" /> 
  tag: <input type="text" name="tag" size="1" /><br />
  <input type="submit" value="表示" style="margin-top:16px;margin-left:40px;" />
</form>