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