PHP・JavaScript・VBの違いを頭の中で比較整理してみる。

自分は専業プログラマーではないですが、VB、PHP、JavaScript、CSS等はことあるごとに触る必要があるため、定期的に頭の中をメンテしておかないと、いざ必要なときにごっちゃになって混乱します。


WEBサイトには静的なHTMLと、動的なPHPやJavaScriptがあり、PHPはサーバーサイドでデータをDBに保存することができ、JavaScriptはクライアントサイドでデータの見せ方を変えることができます。

ただAjaxによる非同期通信のように、クライアントサイドスクリプトでサーバーサイドのコードを呼び出すものもあります。

現在のところクライアントサイドのスクリプトとして、サーバーからのHTML情報を、WEBブラウザのDOM(Document Object Model=HTMLを利用するためのAPI)を通して操作する言語はJavaScriptだけなので、クライアントサイドでの処理は「DOM+JavaScript」によって実現されると限定していいと思います。

定義と使い方

JavaScriptとVBは、クライアントサイドでのアクションを起点とした、イベントハンドラ(イベントドリブン)を実装します。

PHPは、サーバーサイドでHTMLフォームからのPOSTメソッドやGETメソッドを起点に、データをサーバーに引き継いだり、サイトへのアクセスを起点に、HTTP cookie(クライアント)やSESSION(サーバー)に、グローバル変数を送信(保持)します。

PHPとJavaScriptの呼び出し方

PHPのコードはHTMLに埋め込まれており、クライアントがWEBサイト(HTMLページ)にアクセスすると、WEBサーバーがPHPコードの処理を行い、処理結果を返すだけなので、クライアント側でPHPコードを見ることはありません。

外部PHPファイルのインクルード

外部の共通PHPファイルを呼び出す場合は、require_once指定し、ファイルパスが見つからない場合に、Fatal errorを発生させずスキップさせる場合は、include_onceを指定します。

また「_once」なしのincludeやrequireは、パスのファイルが既に読み込み済みであっても再度読み込みます。

(PHPで外部ファイルの読み込み方法)

PHP標準の定数である__FILE__にはPHPファイルのフルパスとファイル名が格納されており、dirname関数で親ディレクトリのパスを取得します。

またPHPのスーパーグローバル変数である$_SERVERは、スクリプトのすべてのスコープで利用可能で、連想配列の添え字にパラメータを設定することで、WebサーバーへのリクエストヘッダーやWebサーバーからのレスポンスヘッダーなどのサーバー変数(ApacheのHTTP環境変数)を取得できます。

JavaScriptが記述される場所

一方、JavaScriptはクライアント側に、一度JavaScriptを含むHTMLページを返して、クライアント側でJavaScriptが実行されるのが大きな違いであり、HTML内の記述される場所は以下の4箇所があります。

  1. headタグ内に<script>タグで囲って書く:bodyより前に読み込まれるJavascript関数
  2. bodyタグ内に<script>タグで囲って書く:表示スクリプト
  3. タグに埋め込む:イベントハンドラ
  4. 外部ファイルを<script>タグで呼ぶ:複数ページで共有するスクリプト

JavaScriptを利用するための定義

イベントハンドラ(イベントに反応して実行される処理)として使われるのはJavaScriptに決まっているので、デフォルトのスクリプトの定義をheadタグ内に記述しておきます。

(Headタグ内のMETAタグによる定義)

METAタグは<head>~</head>間に挿入し、HEADタグ要素ではサポートされない付加的情報の記載をし、「http-equiv」属性に対する値の指定は「content」で行います。

ちなみにequivalentは勘定科目で使われるCash equivalents(現金同等物)と同じく「同等の」という意味です。頭の「eq」はequalですものね。。。

JavaScriptがbody内、または外部ファイルに記述される場合は、scriptタグのtype属性に、スクリプト言語を表すMIMEタイプとして「text/javascript」を指定します。

(scriptタグ内のtype属性にMIMEタイプを指定)

MIMEタイプはHTTPでデータの種類を表すコード(元々はEmailに含める文字以外のデータ定義)です。

type属性とはオブジェクトやスクリプトなどのMIMEタイプや、入力コントロールの種類、リストのスタイルなどを設定するための属性であり、プレーンテキストの場合は「text/plain」、HTML文書の場合は「text/html」、JPEG画像の場合は「image/jpeg」などになります。

HTML内に複数のスクリプトをscript要素内に記述しても、上から下に順番にHTML内でまとめて扱われるので、同一ページで変数が分散していても問題なく引き継がれます。

イベント処理

ページやフォームのロード、アンロード時のイベント

ブラウザがホームページの読み込み完了時に何らかの処理を行いたい場合、bodyタグの中のonLoad属性で関数を指定し呼び出し、現在のページから他のページへ移ろうとした際に何らかの処理を行いたい場合はonUnload属性で関数を指定し呼び出します。

(JavaScriptのイベントハンドラをbodyタグ内のonLoad属性とonUnload属性に指定)

(JavaScriptのイベントハンドラ)

(VBのイベントハンドラ)

ボタン押下時のイベント

HTMLフォームのボタンを押したときの処理は、ボタンのinputタグ内のonClick属性で、イベントに対応したイベントハンドラ(関数)を呼び出し、そのとき発生するPOSTメソッドによって、action属性に指定されたPHPプログラムがサーバー側で実行されます。

(PHPプログラムをPOSTメソッドにより実行・JavaScriptはonClickイベントにより実行)

(JavaScriptによるボタンクリック時のイベント)

VBのイベントであれば「_」の前がコントロール名で後がイベントの種類になります。

(VBのClickイベント)

ドロップダウンリストやコンボボックスが選択された時のイベント

フォーム内のドロップダウンリストが変更されたときの処理は、selectタグ内のonChange属性でイベントに対応した関数を呼び出します。

(HTMLのドロップダウンリスト)

(JavaScriptによるHTMLドロップダウンリスト選択時のイベント)

(VBによるWindowsコンボボックス選択時のイベント)

関数呼び出し

VBの場合、戻り値を返すのがFunctionで返さないのがSubですが、PHPとJavaScriptで単に出力するだけの関数では、引数も戻り値も省略可能です。

PHPやJavaScriptでは、どんなデータ型の値でも関数に渡す事ができ、どんな値が渡されてきてもエラーにはなりません。

また関数で引数が2つしかないのに、呼び出し側に3つ以上の値を引数として指定してもエラーになりませんが、値が渡されてこなかった変数には、未定義値(undefined)が代入されます。

(PHPとJavaScriptの関数への引数の渡し方)

(VBの関数への引数の渡し方)

PHPによるHTTPクッキーとセッションの利用

HTTP cookieは、HTTPにおけるウェブサーバとウェブブラウザ間で状態を管理するプロトコル、またそこで用いられるウェブブラウザに保存された情報のことで、セッションの管理に利用されます。

HTTP cookieを利用した訪問回数カウンタ

WEBサイトにアクセスしたクライアントに対してcookieを送信して、保存されれば次回のアクセス時にcookieがあるかどうかを確認することで、初めての訪問者なのかどうか確認できます。

  1. サーバーへのアクセス時に「srv_yama」という名前のcookieを作成し送信し、値に訪問回数である「1」を書き込みクライアントに保存してもらう。
  2. 次回アクセス時にクライアントから送られてきたcookieをグローバル変数$_COOKIE(連想配列)で取得する。

(PHPによるcookieを利用したアクセスカウンタ)

PHPのセッション接続の流れ

HTTP cookieは、値が入ったクッキーファイルsrv_yamaをクライアント側で管理しますが、SESSIONでは値はサーバ側で管理し、クライアント側にはどのSESSIONを使っているかを識別するためのSESSION IDだけを保存します。

cookieだけを使って値をクライアント側に保存する場合は、スパイウェアにPCに侵入されてクッキーファイルを盗み見られる危険性がありますが、SESSIONでは値はサーバ側にSESSION変数として保存するため、より安全です。

1.クライアントがWEBサイトにアクセスするとSESSIONを開始され、クライアントにどのSESSIONを使っているかを識別するためのSESSION IDがcookie名「PHPSESSID」として送られます。

2.クライアントの処理の中で発生する各種値をサーバーのSESSION変数に保持します。

3.SESSIONの値を削除しSESSIONをすべて破棄します。

コード

まずプログラムコードの構成要素はざっくり以下のようになります。

  1. 変数 > 「値を格納する変数」または「参照(位置情報)を格納オブジェクト型変数」
  2. リテラル > 数値・文字・配列・論理値またはオブジェクト
  3. 式 > 四則演算子で値を得るもの
  4. 文 > 条件文・分岐文など予約語を使った構文

変数

変数の定義

PHPとJavaScriptの有効な変数名は、先頭がアンダーバーかアルファベットで始まり、その後にアンダーバー、数字、アルファベットが続き大文字小文字は区別されます。

PHPの記述のエチケットとして以下のようなものがあります。

  1. 変数や関数名は、先頭文字は小文字でその後単語の区切りを大文字
  2. クラス名は先頭文字も含めて全ての単語の頭文字を大文字
  3. 定数はすべて大文字
  4. 文字列リテラルは基本シングルクォート、変数展開など特別な意図があるときにダブルクォート。

PHPでは「$」+変数名に、どんな型の値(初期値)でも、代入されることで型が実体化されますが、VBでは明示的に変数の型を宣言し、値を代入する必要があります。

PHPでは別のデータ型の値を再度格納すると、格納された値の型に自動的に変更されますが、一度も値が代入されておらず初期化されていない変数には「NULL」が格納されています。

JavaScriptは、PHPとは違いvarの後に「$」なしの変数名を記述し、変数宣言と同時に初期値を代入することで、変数の初期化を行い、宣言して値が一度も代入されていない場合、デフォルトで未定義値(undefined)というグローバル変数を保持しています。

JavaScriptは、VBとは異なりデータ型を持っておらず、変数はオブジェクトとして扱われ、すべての変数がオブジェクトなので、値が代入された変数自体がtoString()という文字列変換メソッドを持っています。

(VBの変数宣言)

(PHPは値を代入したときから変数が利用可能)

(JavaScriptの変数宣言)

PHPの変数やエスケープシーケンス(\n, \’, \”など)は、ダブルクオーテーション中では変換され、シングルクオーテーション中では変換されませんが、Javascriptの場合はどちらでも変換されます。

変数の型変換

変数の、数値と文字列との間での型変換(キャスト)は以下のような表記法の違いがあります。

(PHPの型変換)

(JavaScriptの型変換)

(VBの型変換)

上記はプログラムコード中での型変換の書き方であって、SQL文中での書き方は微妙に異なることがあるので注意が必要です。

(MySQLクエリー中での型変換)

(Oracleクエリー中での型変換)

(Accessクエリー中での型変換)

変数の参照

変数に値を代入するとき、実際には値はメモリ上のアドレスに格納されますが、このアドレスを人間にわかりやすく付けたのが変数です。

参照(リファレンス)代入とはアドレスを代入することで代入元の変数と同じアドレスの値を見ることができます。

値(リテラル)

変数の対義語がリテラルであり、PHPの数値リテラルは内部的に整数・浮動小数点数(小数点を含む数値で固定小数点または指数で表現される)を区別しますが、Javascriptでは内部的にはすべて浮動小数点数です。

演算式の中での数値の自動型変換

PHPで「3+2.14」のような整数+浮動小数点数は、整数が自動的に浮動小数点数に型変換され、「3+”5tahun”」のような文字列の場合は、先頭からの数値の部分の数値として変換されます。

先頭の文字が数値でない場合は0に変換されます。

  • 3+2.14=5.14    //浮動小数点数に型変換
  • 3+”5tahun”=8    //先頭の数値に型変換
  • 5+”tahun”=5    //0に型変換

文字列の結合

文字列(リテラル)の結合方法は以下のような違いがあります。

(VBの文字列結合)

(PHPの文字列結合)

(JavaScriptの文字列結合)

配列リテラル

配列も数値や文字列と同じようにコードの中で配列の定義なしに値を設定すると配列リテラルになります。

(PHPの配列リテラル)

(JavaScriptの配列リテラル)

(VBの配列リテラル)

オブジェクトリテラル

配列がキー(インデックス)で管理され同じ型の値を格納するのに対し、オブジェクトは複数の異なる型の値をまとめてプロパティで管理し、オブジェクトリテラルは「プロパティ名:値」の形式で並べて記述します。

(JavaScriptのオブジェクトリテラル)

(CSSのオブジェクトリテラル)

演算子(オペレーター)と式

演算子には以下の種類があり演算子によって処理される変数/リテラルをオペランドと呼びます。

  1. 算術演算子 : 式または制御文またはSQL
  2. 代入演算子 : 式
  3. 比較演算子 : 制御文またはSQL
  4. 論理演算子 : 制御文でTRUE or FALES

比較演算子はコード中での使用とSQL文の条件部分での使用とでは記述方法が異なる場合があるので注意が必要です。

(PHPの演算子)

(SQLの演算子)

制御文

制御文は以下の3種類で構造化プログラミング(structured programming)を成立させます。

  1. 順次処理(Sequence)
  2. 条件分岐(Selection)
  3. 繰り返し(Iteration)

繰り返し処理

for文はまず初期化式を一度実行し変数の初期化を行い、次に条件式を一度評価し結果としてtrueが返された場合にはfor文の次の文を実行します。

そして変化式を使って条件を変化させ1回目の繰り返し処理を完了し、再度先頭に戻りますが2回目からは初期化式は実行されず条件式を再度評価します。

主に指定した回数だけ繰り返し目的で利用されるのがfor文です。

(PHPとJavaScriptのfor文)

(VBのFor文)

条件が満たされている間は、何度でも繰り返す目的で利用されるのがwhile文ですが、while文には初期化式や変化式がないので、繰り返しの中で実行される文と、条件を変化させるような処理の両方を行う必要があります。

(PHPとJavaScriptのwhile文)

(VBのWhile文)

繰り返しを一度行ってから、条件式を評価したい場合に利用されるのがdo..while文ですが、do..while文の最後にセミコロンが必要であることに注意します。

(PHPとJavaScriptのDo~while文)

(VBのdo~Loop While文)

条件分岐処理

PHPとJavascriptではswitch・・・case、VBではSelect・・・Caseを使い、VBのCase中にbreakは必要ありません。

(PHPとJavaScriptのswitch~case文)

(VBのSelect~Case文)

配列

配列が管理するデータは要素と呼ばれ、要素には角括弧(PHPとJavaScript)やカッコ(VB)で囲んだキーと値のペアが格納されます。

キーは配列の中から値を取り出す時の目印になるもので、通常配列ならインデックス(数字)、連想配列なら文字列になります。

PHPの配列

通常配列$resultの要素を値変数$valに格納しながらループ処理を行い、連想配列$params内のキーと値を一時変数$keyと$valueに格納しながらループ処理を行っています。

PHPの場合は配列変数に値を入力する時点で型が決まり、forやforeachで要素のキーや値を取得します。

VBの配列

VBの場合は事前に配列の型宣言が必要で、For~NextやFor Each~Nextで配列の値を取得します。

JavaScriptの配列

JavaScriptの場合は、配列オブジェクトを作成し、forにて値を格納し、for (i in result)で値を取り出すことができます。

JavaScriptの配列とオブジェクト

ObjectオブジェクトはJavaScriptで利用される全てのオブジェクトの親であり、Objectオブジェクトで定義されているプロパティやメソッドは、各オブジェクトに委譲(クラスでないので継承ではない)されます。

複数の値を集めて番号を付けたものは配列ですが、オブジェクト型は基本データ型のように単独の値ではなく、様々な値(数値・文字列・配列・関数)の集合体であり、オブジェクト型のオブジェクトとなります。

JavaScriptでは、連想配列のキーをオブジェクトのプロパティと考えると、オブジェクトと同義になり、オブジェクトへの参照が代入されたオブジェクト変数に対して、ドット演算子を使うことでプロパティを表し、値を取得できます。

オブジェクトは、複数のデータ型の値をプロパティで管理したものであり、プロパティ名として文字列を使った場合に、プロパティに対してアクセスするには連想配列の形式を使うことも可能です。

オブジェクト

PHPやJavaScriptはオブジェクト指向言語ですが、別にクラスやコンストラクタ関数からオブジェクトを生成して、メソッドとして実行しなくとも、単に普通の関数として実行しても問題ないわけです。

オブジェクトを生成するか否かはnew演算子の有無で判断でき、既存のオブジェクトのプロパティやメソッドを扱うには、SETでオブジェクト変数に参照代入する必要があります。

VBAとVBでのオブジェクトの操作

VBAやVBでは、アプリのクラスからオブジェクトをnew演算子で生成することはあっても、自分でクラスを定義してメソッドやプロパティを実装するケースは少ないと思います。

オブジェクトはプロパティ(属性)やメソッド(命令)を持っていますので、それを代入するオブジェクト型変数にも同じ機能が必要であり、オブジェクトを代入した変数は参照という形で、そのオブジェクトのプロパティやメソッドを操作するためにSETを使う必要があります。

(VBAのオブジェクト変数にSETで参照を代入)

(VBからExcelを操作)

CreateObject関数はオブジェクトのインスタントを生成する関数であり、Newでクラスからオブジェクトを生成するのと同じです。

(VBでDB接続)

(VBによるASPプラグイン)

すべてのタイプのオブジェクトを表す総称Objectを使って、どんなオブジェクトでも格納できるオブジェクト型の変数は「As Object」と指定します。

PHPでのクラス定義

クラスを使わず関数として外部から実行する場合は、自分一人で関数すべてを定義し実行するようなものであり、クラスのメソッドを実体化したオブジェクトを通して実行する場合は、それを実行する実体の設計図を作成し、目的にあわせて設計図から実体を作成し、実体に処理を行ってもらうようイメージになります。

(PHPでオブジェクトのメソッドを実行)

クラスは値を保存するためのメンバ変数と、クラスで行う処理を記述するメンバメソッド(メンバ関数)を持っており、アクセス修飾子のデフォルトはpublicなのでカプセル化が必要な場合はprivateを指定します。

オブジェクトの作り方(PHPのクラス・JavaScriptのコンストラクタ関数とプロトタイプ)

PHPとVBでは、クラスは実体化することでオブジェクトとして利用しますが、JavaScriptにはクラスがなくコンストラクタ関数をnew演算子でオブジェクト化します。

(VBのオブジェクト変数にSETで参照を代入)

(PHPのオブジェクト生成)

(JavaScriptでオブジェクト生成)

PHPでメソッド(メンバ関数)を実行するには、クラスをnew演算子で実体化(オブジェクト作成)する必要がありますが、その際の引数をクラス内のメンバ変数にセット(初期化)するためにコンストラクタを使います。

(PHPのコンストラクタで引数をメンバ変数にセット)

JavaScriptにはクラスがなく、コンストラクタ関数を定義しthisでオブジェクト自身のプロパティやメソッドにアクセスします。PHPがnew演算子でクラスを実体化するのと同じように、JavaScriptではコンストラクタ関数をnew演算子でオブジェクト化します。

(JavaScriptのコンストラクタ関数でオブジェクト生成)

オブジェクトを生成しないのであればコンストラクタ関数ではなく、通常の関数でオブジェクトを定義し、外部からメソッドを実行します。

(JavaScriptの通常関数の呼び出し)

JavaScriptのオブジェクトからプロパティやメソッドを指定する方法は、連想配列でキーを指定する方法と同じです。

(PHPでオブジェクトのメソッドを指定)

(JavaScriptでオブジェクトの関数を指定)

コンストラクタ関数はクラスのように親を継承できないので、コンストラクタ関数から引継ぎたいコンストラクタ関数をcallすることにより、委譲(拡張)されたオブジェクトを生成します。

オブジェクトにはそのオブジェクトのコンストラクタ関数を呼び出すためのcallメソッドが必ず存在し、呼び出す際の最初の引数に必ずthisを指定します。

(JavaScriptのcallメソッドで拡張する関数を呼ぶ)

JavaScriptでのオブジェクトを引継ぐ(委譲する)別の方法としてプロトタイプを使う方法があります。

すべてのオブジェクトにはprototypeメソッドが存在し、他のオブジェクトのプロトタイプを作成し、振る舞いの再利用 (クラスの継承)することで実現させます。

(JavaScriptのprototypeでオブジェクトの拡張)

グローバル関数とグローバル変数

プログラミング言語の仕様で定められた変数名や、関数名として定義できない単語を予約語といいますが、予約語となりうる単語は制御文(if、while など)、プログラムの構成要素(function、const など)、組み込み関数(open、readなど)、組み込みの型(int、stringなど)です。

グローバル関数(内部関数)

PHPにもJavascriptであらかじめネイティブ実装されているグローバル関数(組み込み関数)があります。

PHPの文字列関数

PHPの文字列関数には、文字列の取得開始位置から取得終了位置までの部分文字列を取得するsubstr関数や、HTMLの予約語をHTMLエンティティにエンコードするhtmlspecialchars関数などがあります。

また日本語に対応したmb_substr($str, num_stat, num_len)やstr_replaceなどのマルチバイト文字列関数がありますが、事前にphp.ini中にマルチバイト関数利用のための設定が必要です。

JavaScriptの組み込み関数

JavaScriptの基本データ型である数値や文字列は、クラスを元に作成されたオブジェクトではないのでメソッドもないですが、基本データ型に対応するラッパーオブジェクト(ユーティリティ集)があります。

PHPのsubstr関数は組み込み関数ですが、Javascriptのsubstrは文字列のラッパーオブジェクトであるStringオブジェクトのメソッドです。

ラッパーオブジェクトのおかげで、基本データ型の値に対しても、オブジェクトに対して行うようにメソッドを呼び出すことができます。

コンストラクタ関数の引数に、数値、文字列、論理値という基本データ型の値を指定する場合は、基本データ型に対応するラッパーオブジェクト(Number、String、Boolean)のオブジェクトを作成します。

(JavaScriptのオブジェクト型オブジェクトを生成し値をセット)

(JavaScriptのラッパーオブジェクトで基本データ型オブジェクトを生成し値をセット)

情報の出力

JavascriptのDocumentオブジェクトは、サイトの文書を管理するオブジェクトで、writeメソッドで出力を行います。

VBではフォームのプロパティに値を代入するか、フォームのPrintメソッドで出力します。

PHPでは関数ではなく、PHPの言語構造であるechoまたはprintで出力します。

(PHPの言語構造echoまたはprintで出力)

(JavaScriptのdocumentオブジェクトのwriteメソッドで出力)

(VBのフォームのPrintメソッドで出力)

ダイアログと確認ダイアログ

JavascriptのWindowオブジェクトのalertメソッドは、ユーザーからの入力を要求したり、ユーザーへ何らかのメッセージをダイアログ(メッセージボックス)で表示したい時に利用します。

(JavaScriptのwindowオブジェクトのalertメソッドでダイアログ表示)

(VBのMsgbox関数でダイアログ表示)

Javascriptで確認ダイアログを利用するには、Windowオブジェクトのconfirmメソッドで確認メッセージを表示して、Yesなら処理を行う。

(JavaScriptの確認ダイアログ)

(VBのMsgBoxによる確認ダイアログ)

PHPのスーパーグローバル変数(定義済み変数)

PHPのグローバル変数はスクリプト全体を通してすべてのスコープで使用可能な組み込みの変数でありスーパーグローバルといいます。

連想配列の添え字にパラメータを設定することで、サーバー情報やHTTP通信に関する変数の値を、連想配列で取得できます。

  • $GLOBALS:グローバルスコープで使用可能なすべての変数への参照
  • $_SERVER:サーバー情報と実行時の環境情報
  • $_GET:HTTPのGET通信
  • $_POST:HTTPのPOST通信
  • $_FILES:HTTPのファイルアップロード変数
  • $_COOKIE:クッキー変数
  • $_SESSION:セッション変数
  • $_REQUEST:リクエスト変数
  • $_ENV:環境変数

こんな投稿も読まれています