Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
ウエブアプリケーションPHP その1
2019/11/21海谷 治彦
1
目次
• サーバーサイド技術の位置付け (また復習)• PHP 概要
• 本日はPHPのプログラム言語としての側面に注視
• 関数
• 文字列
• 配列
• クラス
• データベース接続
2
サーバーサイドの主な役割
• 検索,計算,データ保存や共有,手順のナビゲート,画面データの生成等
3
データ
検索
計算
生成
送受信
保存
復習+
サーバーサイドの具体的技術
• JavaによるJSP/Servlet• 銀行系等の大規模で信頼性の必要なシステム向け.
• PHP• お手軽にサイトを作るサーバーサイド言語.
• Cに似ている.
• Ruby on Rails• もっとも有名はモダンフレームワーク.
• 伝統的なCGI (Common Gateway Interface)• Perl, Ruby, C等でサーバー側処理をするもの.
• いまどきは見かけない.
4
復習
サーバーと対話
• HTTPリクエスト/レスポンスは複数回行われる.• 無論,JSも使えるが.
• サーバー側のデータが使えるので,例えば,端末を変えても処理が継続できる.
• 途中まで大学でやって,あとは家のPCでやるとか.
5
ブラウザ
JSプログラム
・・・・・
入力画面準備
選択肢を送る
結果が返ってくる
サーバー側のデータ
サーバープログラムweb
storage等
復習--
サーバーとの対話
• ユーザーの入力手段• form というタグを用いて,受け取りページを指定して,自身の入力情報とともにHTTPリクエストを送る.
• 無論,受け取りページは処理能力がなければいけない.(通常,PHPやServletで書かれる)
• 出力手段• 受け取りページに結果が埋め込まれた形で,HTTPレスポンスが返ってくる.
• その結果をブラウザが表示する.
• 入力したページとは別のページに移動していることを注意.(ページ遷移と呼ばれる)
• サーバーもクライアントも一連のページであるという情報を(細工無しでは)もっていない.
6
復習
Formの典型様式
7
<form action="http://www.example.com/form.php" method="post">Topic: <input type="text" name="topic" size="20">
<br><textarea rows="5" cols="22" name="feedback"></textarea>
<br><input type="submit" value="send"></form>
メッセージを受け取るページを指定.このページはリクエスト処理の能力がないといけない.
get もしくは post を指定.違いは後述.
ユーザーの入力値を最終的に受け取りページに送るための呪文.
ユーザー入力場所の指定.詳細は後述.ユーザー入力場所の指定.詳細は後述.
復習
GETとPOST• GET
• 本来はサーバーからのデータ取得リクエストに用いる.
• よって,クライアント側から原則データを送ることはできない.
• しかし,URL自体にデータを付記することで,データを無理やり送ることが可能となっている.
• 送ったデータはURLを見ただけで丸見え.
• POST• サーバーにデータを送る本来のリクエスト.
• リクエストの本体(ヘッダーより下)に送るデータが付記される.
• 一応,ぱっと見にはデータは見えないが,暗号化されていないHTTPは簡単に傍受できるので,実際にはデータは丸見え.
8
復習
クライアントからデータを送る
• POSTを使えば任意のデータをサーバーに送れる.
• しかし,パラメータ名と値の対として,データを送るのが一般的.(一般にkey-valueデータと呼ばれる)
• 以下の arg1 と arg2 がそれぞれパラメータ名
• 以下の 7 と 5 がそれぞれの値
• サーバーは,これらパラメータの値に基づいて,サーバー側で計算(含む検索等)を行い,その結果を新しいページとして返すのが普通.
9
PHPサンプルの動かし方
1. 仮想マシンを起動
2. 自分のユーザーの ~/public_html/ の下にサンプルが入った zip をダウンロード.
3. 当該zipを unzip 等で展開
4. 必要に応じて,展開したファイルのアクセス権を開放.
chmod -R a+r sample10 等
10
PHP vs JSP/Servlet• JSP/Servlet
• Javaで書いてあるので本格的なアプリケーション(特にMVCのモデルのModel部分)を構築できる.
• 動作環境のセットアップがかなりメンドい.
• 開発と配置もめんどい (IDEがあれば緩和される)• すくなくともコンパイル等が必要.
• PHP• 所謂,スクリプト言語なので気軽に作れる.
• 動作環境のセットアップも割りと楽.
• 本格的なオブジェクト指向言語というわけではないので,アプリの保守が面倒になるかもしれない.
11
PHP• スクリプト言語 (手動コンパイルは不要)• Python, Ruby, Perl同様,単独利用も可能らしいが,主にウエブアプリのサーバーサイド言語として用いられる.
• 結構,バージョンアップが早い.• 本授業では,5.4 を用いる.コレはかなり古い.
• 最新は 7 (6は存在しない)
12
ウエブページに挿入
• 拡張子は .php (で動くように設定してある)• 基本,HTML記述に部分的に php 処理を埋め込む感じ.
• JavaScriptやJSPにノリが似ている.
• 埋め込みタグは何種類かあるが,以下が一般的.<?php プログラムを書く ?>
• 一番,一般的な書き方.
<? プログラムを書く ?>• コレはデフォルトでは無効になっている書き方.
<script language="php"> プログラムを書く </script>• JavaScriptっぽい書き方.
• あくまで PHP はサーバーで実行されるため,ブラウザに届く時には単なるHTMLである.
• JSPと同じ.
13
CやJavaと違う点
• 関数やクラスの名前において大文字/小文字の区別をしない.
• 変数名は区別する.
• 変数には$をつける.• Perlやshellっぽい.
• 変数宣言が無い.よって宣言時点での型指定もない.
• ちょっとJavaScriptっぽい.
• 文法上,配列と連想配列の区別がほぼ無い.
• globalキーワード.
• 文字列の連接は . を使う.(+ではない)
14
特徴的な部分
• 変数名自体を変数にいれて指定することができる.• $a="name" だとすると $$a は $name という変数を指す.
• 変数への参照,エリアス• ちょっとポインタやリファレンスに似てる.
• $name =& $anothername; とする.
• 外部のコードを読み込む: include と require • require のほうは読み込み失敗すると,以降の処理もとまる,致命的なエラーとなる.
• include は警告のみ.
15
CやJavaと類似している点
• Java風のclassベースのオブジェクト指向である.• JavaScriptとは違う.
• foreachスタイルのforが,foreach というキーワードで利用される.
• 関数パラメータは,基本 call by value である.
16
関数: 概要
• 組み込み関数と自作の関数がある.
• 関数名に大文字小文字の区別が無い.
• 同じ関数でも異なるパラメータをとる定義ができる.
• パラメータは,基本,call by value• call by ref. したいのであれば,&をつける.
• 関数定義は入れ子にできるが,スコープに影響しないので意味が無い.
• 関数内の変数はスコープが効いてくる.
• グローバル変数に関数からアクセスしたい場合には,globalのキーワードを付ける.
• static変数もある.
17
関数呼び出し失敗と die関数
• 関数呼び出しに失敗すると多くの場合,false を返す.
• よって,
関数呼び出し || die("なんか警告");• という書き方で,失敗対処することが多い.
18
関数のパラメータ
• 基本,call by value である.
• call by reference にしたい場合には,& をつける.
• デフォルト値を指定し,呼び出し時点にパラメータ指定を一部省略することができる.
• 可変パラメータを指定できる.ちょっとCに似てる.
• funcParam.php
19
関数の返り値
• 基本,コピーを返す.
• しかし,&をつけることで,返り値自体の参照を返せる.
• funcRet.php
20
文字列: 概要
• 文字列の指定法: "aa", 'aa' そして <<<• echo, print, printf, print_r• 比較
• 便利な関数群
21
文字列の指定
• '文字列• ' ¥' と ¥¥ 以外は,そのまま.変数等は展開されない.
• "文字列"• 変数は展開される.
• 各種,特殊文字が使える.
• >>>• Here Document と呼ばれるらしい.
• 例参照.
• strDef.php
22
表示
• echo 複数の値の単純表示
• print 一つの表示
• printf Cのprintfにほぼ同じ
• print_r 変数の情報を詳しく表示,特に配列やオブジェクト等.
• var_dumpのほうがみやすいらしい.
• 詳細は配列,オブジェクトのところにて.
• 個別文字へのアクセス
• strPrint.php
23
便利な関数群
• trim, ltrim, rtrim 前後の空白除去.
• strtoupper, strtolower 全大文字化,小文字化
• ucfirst, ucwords 語頭の大文字化
24
文字列の比較
• == と === • 前者は型の不一致を気にしない,後者は気にする.
• 辞書式順序に従い,< <= > >= 等の比較もできる.
• strcmpもある.(C同様)
25
その他,便利な関数
• explode• CSV等,特定のセパレータで区切られた文字列を,ばらして配列にする.
• Perlのsplitと同じ.
• sscanf• Cのsscanfに似ているが,結果を配列で返す.
• strMisc.php
26
配列
• 配列にはインデックス配列(普通の配列)と連想配列がある.
• 配列の初期化 array()• 連想配列から変数へ変換 extract, その逆 compact• foreach($array as $v)• foreach($array as $k => $v)• 末尾への追加
• count($array)
• array.php
27
PHPのクラス,インスタンス
• JavaScriptと比べれば,Javaに近いクラスベースのオブジェクト指向である.
• しかし,以下のような差異がある.
1. PHPで予約されたメソッド名には __ が冒頭に付く.アンダーバーが二つです.• __construct, __destruct, __sleep, __wakeup等
2. メソッドに関するJava風のオーバーロードができない.
3. トレイト(trait)と呼ばれるクラスとは異なる再利用部品.• ただし本授業でのバージョンでは利用できない
4. その他,微妙な言い回しの違い
28
サンプル classDef.php• 適当なクラスを定義してインスタンスを操作する一般的なコード.
• public, private等を省略すると public扱いらしい.
• Java風オーバーロードが無いのでちょっと不便かも.
• Javaでは . によるメンバーアクセスだが,PHPでは->
• static メンバーへのアクセスが微妙に独特.
• $this->member
29
Java風オーバーロード
• Java等の型を厳格に定義する言語では,同じ名前だが,異なる引数の数と型,返り値の型を持つメソッドを同時に定義できる.
• メソッド名が意味とすれば,同じ意味のメソッドは同じ名前で扱えるので超便利.
• PHPではコレはできない.
30java.lang.String クラスでは 4個のindexOfメソッドが定義されている.ちなみに,コンストラクタも15種類定義されている.
static属性,定数
• クラス共通である属性,メソッドにはstaticをつける.
• そのアクセスには,• クラス外からは クラス名::名前
• クラス内からは self::名前
• 定数はconstで宣言するが,自動的にstatic扱いになる模様.
• サンプル classStatic.php
31
継承,instanceof 演算子
• Java同様,extends で継承できる.
• スーパークラスのメンバーは parent::名前
• 自クラスのメンバーは self::名前
でアクセス.
• finalキーワードが付いたメソッドはオーバーライドできない.
• $v instanceof クラス名 であるクラスのインスタンスか否かをチェックできる.
• サンプル classExtend.php
32
インタフェース
• Java同様,複数のインタフェースをクラスで実装(implements)できる.
• 返り値,引数に型が無いので微妙に非力ではあるが,まぁ,無いよりマシ.
33
抽象メソッド
• Java同様にあります.
34
Introspection• Javaのreflectionに近い機構.
• 内部検査という訳語がある模様だがお勧めしない.イントロスペクションでよいと思う.
• C言語等では,関数名,変数名等のシンボルは,コンパイル後には原則消えてなくなってしまう.(アドレスに置き換えられる)
• 正確にはリンケージ後.
• コンパイル時点でデバッグオプションを指定すれば残る.
• JavaやPHPでは実行時でもシンボルを保持していため,文字列を使い関数や変数を指定できる.
• 特にPHPでは可変変数があるので,もともとIntrospection に適しているといえる.
• $x="user" において $$x を $user とみなす等.35
クラス/オブジェクトのIntrospection• クラスに定義されているメソッドや属性を列挙できる.
• あるオブジェクト(インスタンス)が何クラスのインスタンスなのかも調べられる.
• サンプル classItrspct.php
36
シリアライズ Serialize• オブジェクト(インスタンス)を単なるデータ列に変換すること.
• データ列に変換すると,ファイルに格納できたり,データ通信に基づき他マシンにオブジェクトを送付できたりして便利なことが多い.
• 大抵のオブジェクト指向言語で利用可能な技術.• JavaだとBeansやXMLEncoder等がお手軽.
• PHPでは以下の二つの関数で符号化/復号化できる.(別に暗号化はされてません.)
• serialize• unserialize
• サンプル classSerial.php• 対抗馬で json_encode, json_decodeってのがある.
37
データベース接続
• DBMS毎に接続する方法(mysql.php)とPDOと呼ばれる汎用ライブラリを使う方法がある.
• サンプル pdoSelect.php にもあるが,データベースがオブジェクトになっているので,旧来法より使い勝手がよい(かもしれない).
38
PDOの典型
• $db = new PDO(略)データベース接続のためのオブジェクトを作成.
• $statement=$db->prepare(“SQL命令文字列");SQL命令の準備
• $statement->execute();SQL命令の実行
• あとは命令の種類によって,結果が獲得できたり,データベースを改変できたりする.
39
PDO で select• pdoSelect.php を参照.
• $statement->execute(); の後に,$statement->fetch()が偽になるまで,行をとってこれる.
• 結果は連想配列と普通の配列の混合っぽく返る模様.
40
PDO で insert• pdoInsert.php を参照
• $db->prepare 時点で,:valname 等,後からパラメータを割り付けるポイントをSQL命令にいれておく.
• bindParam で パラメータに実際に変数を割り付ける.
• 変数じゃないとダメな模様,即値(定数など)や式はだめ.
• その後,execute する.
41
PDO で delete• pdoDelete.php を参照
• $db->prepare 時点で,:valname 等,後からパラメータを割り付けるポイントをSQL命令にいれておく.
• bindParam で パラメータに実際に変数を割り付ける.
• 変数じゃないとダメな模様,即値(定数など)や式はだめ.
• その後,execute する.
42
phpデバッグのポイント
• エラー情報は /var/log/httpd/error_log に吐き出される.
• 上記は root でないと見られない.
• 上記の log を見て,エラーの状況を調べる.
43
演習7• mysqlにあるテーブル nameage から,最も age が低い行を全削除する php ページを作成せよ.
• 該当する行が複数あれば,それら全てを削除.
• 最も小さい age の値をページに表示してもよいし,無言でもよい.
• ファイル名は ex07.php とせよ.
• 対話的な処理ではないこと.
• PDOを使うことが望ましい.
• テストデータは適宜,mysqlコマンドから直接に入力せよ,ウェブアプリで入力する必要は無い.
44
以上
45