初心者による初心者のためのPHP講座 第4回 定数と変数

多くのプログラミング言語同様に、PHPでも、定数、変数を使うことが出来る。

定数、変数とは、「初心者による初心者のためのPHP講座 第3回 文字列」で学んだ文字列などの値を格納しておく箱のようなもので、命令文の中などで箱から値を取り出して使うことが出来る。

定数

定数とは変わることない不変の値、不変の値を格納する箱を指し、define()関数を使って以下のように定義する。

define("定数名", 値);

定数名には、アルファベット、数字、アンダースコアを使うことが出来るが、最初の1文字はアルファベットかアンダースコアである必要がある。

また、特別な引数を設定しない限り、アルファベットの大文字と小文字は区別され、別のものとして扱われる。

定義した定数に格納された値は、定数名で取り出すことが出来る。

難しいことを考えるよりも、実際にサンプルを見たほうが理解が早いだろう。

以下のサンプルでは、echo()関数と組み合わせて定数を使用している。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>定数</title>
</head>
<body>
<?php
define("VALUE1", 100);
define("VALUE2", "100");
define("VALUE3", "こんにちは");
echo VALUE1."<br />";
echo VALUE2."<br />";
echo VALUE3."<br />";
echo VALUE1."円"."<br />";
echo VALUE3."。 この商品は".VALUE1."円です。";
?>
</body>
</html>

上記のスクリプトの実行結果を表示

定数に文字列を格納する場合は、前回学んだ通り「”」や「’」で囲む必要がある。

数値を格納する場合は、「”」や「’」で囲む必要はないが、文字列として数字を扱う場合は、「”」や「’」で囲む必要がある。

例えば「”1″」と「1」は、それぞれ文字列と数値であり、プログラミング上では、本来は別物であり、区別されるべきものだが、PHPでも区別はあるものの、その区別が曖昧である。

この事は、変数の説明の際に再度述べる。

定数は、何度でも呼び出して使用することができ、一度、定数を定義してしまえば、後は定数として呼び出すだけで良いので、都度、値を記述するより遥かに楽であるし、ミスも起こりにくくなる。

実際、上記のサンプルでも定数「VALUE1」、「VALUE3」は、2度以上使われている。

文字列の連結同様に「.」を使って、定数や文字列と連結することも出来る。

定数は、不変の値を考えるよりも、一度定義したら変更が効かない値と考えたほうが分かりやすいかもしれない。

つまり、箱の中身を取り出すことは出来ても、入れ替えることは出来ない。

定義した後で値を変更する必要がなく、繰り返し使う可能性がある値は、定数として定義すると良いだろう。

変数

変数とは、変化する可能性がある値を格納する箱のようなものである。

定数が、一度定義したら値の変更が出来ないのに対して、変数は、何度でも値を変更することが許されている。

つまり、箱の中身を自由に入れ替えることが出来る。

変数の定義は、定数と異なり関数を使う必要がなく、非常にシンプルである。

$変数名;
$変数名 = 値;

「$」が変数であることを表し、空の変数を定義するなら単に「$変数名」と宣言すれば良いし、何かしらの値を代入した変数を定義するなら「代入演算子」である「=」を使って値を代入した形で変数を定義すれば良い。

値の代入の有無は別として、この要領で変数を宣言をした時点で変数は初期化され、値が格納される。(値を代入していない場合は、空の値が格納される。)

このあたりは、数学の代入と要領は同じである。

変数名には、アルファベット、数字、アンダースコアを使うことが出来るが、最初の1文字はアルファベットかアンダースコアである必要がある。

また、アルファベットの大文字と小文字は区別され、別のものとして扱われる。

「$$value」のように変数名に変数を使う使うことも出来るが、ここでは説明を省く。

では実際にサンプルを見てみよう。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>定数</title>
</head>
<body>
<?php
$value;
$price = 2000;
$birthday = "19970903";
$comment = "こんにちは。";
define("VALUE1", "おはよう。");
echo "値は「".$value."」です。<br />";
echo $price."<br />";
echo $birthday."<br />";
echo $comment."<br />";
echo $comment." この商品は".$price."円です。<br />";
echo VALUE1." この商品は".$price."円です。<br />";
$value = "ありがとう";
echo "値は「".$value."」です。";
?>
</body>
</html>

上記のスクリプトの実行結果を表示

定数同様に、文字列と数値の区別があり、文字列を変数に代入する場合は、「”」や「’」を使う必要がある。

「.」を使って文字列や定数と連結することも出来る。

変数「$value」をecho()関数でブラウザに表示した結果が、16行目と23行目では異なっているが、16行目の時点では、$valueは空であり、22行目で初めて文字列を格納しているためである。

このように変数に格納された値は、再度、値を代入する形で容易に変更できる。

値の代入の応用

変数に変数を代入したり、関数の戻り値を代入することも可能である。

<?php
$today = date("Y/m/d");
$message = "今日は".$today."です。";
?>

このサンプルでは、 date()関数の戻り値、つまりは現在の日付を変数「$today」に代入している。

更に変数「$today」は、変数「$message」に代入されている。

代入演算子「=」以外にも、「+=」、「 -=」、「*=」、「/=」、「%=」、「.=」と言った代入演算子を使用することができる。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>様々な代入演算子</title>
</head>
<body>
<?php
$num1 = 8;
$num1 += 5;
$num2 = 1000;
$num2 -= 500;
$num3 = 3;
$num3 *= 4;
$num4 = 21;
$num4 /= 7;
$num5 = 17;
$num5 %= 5;
$str1 = "鈴木";
$str1 .= "さん";
echo $num1."<br />";
echo $num2."<br />";
echo $num3."<br />";
echo $num4."<br />";
echo $num5."<br />";
echo $str1;
?>
</body>
</html>

上記のスクリプトの実行結果を表示

上記のサンプルで使われている演算子のうち「.」は、文字列、定数、変数の連結で学んでいるが、その他は、下記のとおりである。

  • + ・・・足し算
  • - ・・・引き算
  • * ・・・掛け算
  • / ・・・割り算
  • % ・・・割り算の余りを求める

上記のサンプルは、下記と同じ意味であり、下記のような記述の方が理解しやすいだろう。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>様々な代入演算子</title>
</head>
<body>
<?php
$num1 = 8;
$num1 = $num1 + 5;
$num2 = 1000;
$num2 = $num2 - 500;
$num3 = 3;
$num3 = $num3 * 4;
$num4 = 21;
$num4 = $num4 / 7;
$num5 = 17;
$num5 = $num5 % 5;
$str1 = "鈴木";
$str1 = $str1."さん";
echo $num1."<br />";
echo $num2."<br />";
echo $num3."<br />";
echo $num4."<br />";
echo $num5."<br />";
echo $str1;
?>
</body>
</html>

定義済み変数

PHPでは、予め定義された変数がある。

つまり、自分で値を代入する必要がなく、何もしなくとも予め値が格納されており、自由に値を取り出して使うことが出来る変数である。

「$_SERVER」、「$_GET」、「$_POST」、「$_COOKIE」などがそうであるが、これらについては、実際に使う機会に詳しく説明する。

これらは「スコープ」を無視して使えることから、「スーパーグローバル変数」と呼ばれている。

※「スコープ」については別の機会に説明する。

参照渡し

次のサンプルでは$aと$bは実質的に同じ意味を持つ。

つまりどちらの値は「100」である。

<?php
$a = 100;
$b = $a;
?>

では、次のプログラムの実行結果はどうなるだろうか?

<?php
$a = 100;
$b = $a;
$a = 200;
echo $b;
?>

「100」と表示されるという予想と「200」と表示される予想の2つの予想が成り立つのではないかと思うが、答えは「100」である。

$aとSbは、値こそ同じかもしれないが、全く別の変数であり、$bが定義された時点で「100」が代入されており、$bを定義し直さない限り、$bの値を変えることは出来ない。

では、次のサンプルの結果はどうなるだろうか?

<?php
$a = 100;
$b = &$a;
$a = 200;
echo $b;
?>

答えは「200」である。

3行目の$bに$aを代入する式で「$a」の前に「&」を付けて「&$a」としているが、こうすることによって、後に$aの値が変わった際に、$bにも反映されるようになる。

これを「参照渡し」と呼ぶ。

変数の型

ここまでの説明から、変数の値には、文字列と数値があることに気づいたと思うが、実際、様々な種類の値を変数に格納することが出来る。

変数に代入される値の種類を「変数の型」と呼び、プログラミング上では、型の違いを意識する必要がある。

しかし、PHPも例外ではないが、PHPにおいては「変数の型」の区別が曖昧である。

以下、主な「変数の型」をまとめる。

文字列

文字列は、「初心者による初心者のためのPHP講座 第3回 文字列」で説明した通りである。

$my_string = "おはよう";

整数

数値の一種で、小数点を持たないもの。

PHPでは、-2,147,483,648 から 2,147,483,647 までの整数値を扱うことが出来る。

$my_integer = 1000;

浮動小数点

小数点を持つ数値。14桁まで扱うことが出来る。

$my_float = 3.1415;

論理値

格納できる値は、trueまたはfalseのみで、それぞれ「正しい」、「誤り」を表すと考えると理解しやすいかもしれない。

プログラミング上では「真偽」という。

この型は、ある事柄に関して、それが正しいか、誤りかを判定する際に使われる。

例えば、特定の条件の満たすなら「true」を格納し、そうでない場合は「false」を格納しておいて、後の処理でその値を判別に利用する。

$my_boolean = true;
$my_boolean = false;

文字列の「”true”」や「”false”」とは本質的に意味が異なり、「”」を必要としないことからも分かるように文字列として値が格納されているわけではなく、この型の変数をecho()関数で表示すると、値が「true」の場合は、「1」が表示され、値が「false」の場合は、何も表示されない。

真偽の判定ではあるが、echo()関数で「true」、「false」と表示させたいなど、文字列とし再利用する必要がある場合は、以下のように最初から文字列として定義したほうが良い場合もある。

$my_boolean = "true";
$my_boolean = "false";

しかし、似て非なるものであり、上記の例の型は「文字列」であり、もはや「論理値」ではない。

配列、連想配列

区切り文字で区切られたリスト状の値、階層構造を持つリストのような複雑なデータを変数に格納に、容易に処理が出来る点もPHPの特徴である。

「配列」、「連想配列」については、別の機会に詳しく述べる。

$my_array = array(
	"鈴木さん" => array('男', '20'),
	"田中さん" => array('女', '68'),
	"山田さん" => array('男', '45'),
);

オブジェクト

「class」を使った「オブジェクト指向プログラミング」を行う際に使用するが、本講座でのサンプルプログラムは、「オブジェクト指向」ではないので、ここでは説明を省く。

NULL

NULL型とは、値として何も格納されていない空の状態である。

「NULL」が代入されている場合の他、何も代入されていない場合もNULL型となる。

<?php
$my_null = NULL;
$my_null;
?>

その他の型

「リソース」、「ストリーム」と言った特殊な型も存在するが、これらは特定の処理の際に使うものである。

型の区別の実際

PHPは、型の区別が非常に曖昧なプログラミング言語であり、そのため型の区別をあまり意識する必要がないので、PHPが「易しい言語」である理由の1つになっているかもしれない。

但し、これがプログラマーに優しいか否かは別問題ではあると思うが・・・。

次の例は、演算子「+」を使って、数学上の足し算を行なっている。

<?php
$a = 100;
$b = "50";
echo $a + $b;
?>

$aは整数、$bは文字列であり、型を厳密に区別するなら、整数と文字列の足し算など成立しないが、実際には「150」と表示される。

次のサンプルでは、$cに代入する際に足し算を行い、gettype()関数で、$cの型を取得し、echo()関数で表示している。

<?php
$a = 100;
$b = "50";
$c = $a + $b;
echo gettype($c);
?>

結果は「integer」、つまり整数となる。

整数と文字列の足し算の結果が、自動的に整数型になっている。

PHPでは、変数が柔軟に処理される反面、「100」と「”100″」の区別が難しくなっている側面もある。

未定義の変数

次のサンプルは、一文字ずつ、よく見て欲しい。単純なタイプミスがある。

<?php
$my_string = "おはよう";
echo $ny_string;
?>

このサンプルのecho()関数は、未定義の変数「$ny_string」を引数として使おうとしている事になるが、これは「エラー」にはならない。

設定ファイル「php.ini」の設定によっては、「Notice: Undefined variable」と言う「注意」が表示される場合もあるが、これはエラーではないため、処理は継続される。

PHPでは、未定義の変数を使おうとした場合、自動的にNULL型の変数として定義されるようである。

よって、このサンプルは、NULL型の$ny_stringを表示することになるので、結果として何も表示れない。

この場合、処理結果が意図した結果と異なるので、エラーとして表示されなくとも誤りがあることは明確であるが、処理の仕方によっては正常に動作しているように見えることもあるので厄介である。

ともかく、自動定義されるからと言って、変数を未定義のまま使用する事は避けた方が良い。

私も同様のミスをした経験があり、ユーザーから「注意」が表示されることを指摘されて、ようやく、未定義の変数の扱いについて気づいた。

NULL型の変数として自動的に定義される点も、私の処理には都合が良く、処理結果から、この誤りに気づくことが出来なかった。

Posted in PHP, PHP講座, ネット・PC | Tagged | 1 Comment

CodeMirror for CodeEditor バージョン0.4 リリース

「CodeMirror for CodeEditor バージョン0.4」をリリースした。

バージョン0.4 2011/10/30

最新の「CodeMirror for CodeEditor」をダウンロード

バージョン0.4では、新しい機能の追加はないが、内包する「CodeMirror」ライブラリをアップデートしている。

このバージョンで採用した「CodeMirror」ライブラリは、正式リリースのものではなく、開発中のものであり、バージョン2.16の修正版(2.16-22)に当たる。

開発中のバージョンを採用した事には理由がある。

以前のバージョンでは、IEで参照するとタブがスペースに変換され、インデントが正しく反映されない問題が発生しており、以前から気になっていた。

この問題は、バージョン2.16で解消しており、このプラグインでもバージョン2.16を新たに採用するつもりであったが、テストした結果、新たに別の問題が発生していることが分かり、これら全ての問題を解消するために開発中のバージョンを採用した。

なお「CodeMirror」の開発チームは、仕事に熱心で、レスポンスが良く、バグとして報告すれば、直ぐに対応して貰える。

マイナーな用途のライブラリではあるが、こう言った点からも、今後、この手のライブラリの主流の1つになることが予想される。

バグを報告したり、パッチを提供したりするユーザーも増えて来ているようなので、開発自体も更に盛り上がって行きそうだ。

Posted in WordPress, ネット・PC, 自作アプリ | Tagged , , , | Leave a comment

開発者が重宝するプラグイン「Debug Bar」

Debug Bar」は、その名の通り、プラグインなどのデバッグに適したプラグインで、エラー、警告、注意メッセージの確認、SQLクエリーの確認が出来る。

十分な情報を得るためには、をかもとさんの書かれた記事、「WordPress 開発に便利なプラグイン Debug Bar」にもあるように「wp-config.php」に記述を追加する必要があるが、「SAVEQUERIES」、「WP_DEBUG」は、下手に常時有効にする訳にはいかないため、どちらかと言えば、評価環境で使った方が良いプラグインと言える。

また、「Debug Bar」は、フロントエンドや管理画面の上部に表示される「管理バー」から実行するタイプであるため、使用する場合は、管理バーを表示させておく必要がある。

Debug Bar

よって、管理バーが苦手な方には向かないかもしれない。

しかし、「Debug Bar」の機能はこれだけではなく「Debug-Bar-Extender」、「Debug Bar Query Tracer」、「Debug Bar Console」と言ったプラグインで機能を強化できる。

「Debug-Bar-Extender」については、jim912さんが書かれた「Debug BarとDebug-Bar-ExtenderでWordPressのパフォーマンスチェック」という記事が参考になる。

「Debug Bar Query Tracer」は、使っていないため、機能についてはよく分からない。

私が重宝しているのが、「Debug Bar Console」で、このプラグインをインストールすると、PHPやSQLスクリプトを実行できるコンソールが追加される。

もっぱら、PHPプログラムの実行テストに使用しているが、このコンソールは良く出来ており、ちょっとした検証程度のことならここで出来てしまう。

例えば、プラグインなどで定義されたものを含め、WordPressの関数も実行できる。

下記の例では、get_posts()関数を使って最近の10件の記事を取り出している。

$posts = get_posts(array('numberposts'=>10));
foreach($posts as $post) {
	echo($post->post_content);
}

左側に入力したスクリプトの実行結果はコンソール右側に表示される。

Debug Bar Consoleでの実行例1

ただし、実行結果を表示する部分は、ブラウザとして機能するため、実行結果にHTMLタグが含まれる場合は、タグは処理されてしまう。

上記の例であれば、エスケープする処理を加えれば、タグも確認できる。

$posts = get_posts(array('numberposts'=>10));
foreach($posts as $post) {
	echo(esc_html($post->post_content));
}

WordPressがグローバルスコープで定義している変数を使用する場合は、Global宣言が必要となる。つまりスコープが異なる。

下記は、WordPressの変数$localeを使用する場合の例である。

global $locale;
echo($locale);

同じ要領でプラグインが定義している変数も取得できる。

管理バー自体は、WordPressの管理画面以外にフロントエンドでも表示できるが、投稿ページでコンソールを開こうが、アーカイブページで開こうが、このコンソールは、管理画面の一部として機能する。

つまりis_admin()は、常にtrueを返す。

従って、現在のページの記事やコメントを取得すると言った事は出来ないが、IDで指定して取得する方法もあるので、全く不可能ではない。

万能ではないが、癖さえ理解してしまえば、「Debug Bar Console」は、かなり使えるツールになるはずだ。

Posted in WordPress, ネット・PC | Tagged , | Leave a comment

記事にバックスラッシュを入力するためのプラグイン「TinyMCE Backslash Button」

バックスラッシュ「\」を記事に入力する手助けをするプラグイン「TinyMCE Backslash Button バージョン0.1」を新しく公開した。

Ver.0.1 2011/10/22

最新の「TinyMCE Backslash Button」をダウンロードする

日本語環境では、「\」は、「\」として表示されてしまうが、「TinyMCE Backslash Button」を使えば「\」の入力が可能となる。

標準のビジュアルエディター(TinyMCE)に追加されるボタンを使って簡単に「\」を入力でき、「\」になること無く「\」をそのまま表示させることが可能。

TinyMCE Backslash Buttonのボタン

仕組みとしては、欧文フォントを「\」に適用しているだけのため、クライアントの環境によっては「\」と表示されず、「\」となる場合もある。

Posted in WordPress, ネット・PC, 自作アプリ | Tagged , , | Leave a comment

初心者による初心者のためのPHP講座 第3回 文字列

※「\」が「\」に見える場合は、別のPCからアクセスする事をお勧めする。この記事では、意図して「\」を使用しており、「\」と「\」の区別が出来たほうが分かりやすい。

「文字列」とは、文字を集まり、つまりは文字で書かれた単語や文の事を指し、単語、文の長さに関係なく、PHPで文字列を扱う際は、それが文字列である事を表す構文を使う必要がある。

第2回 PHPの基本構造」でも、echo()関数の引数として文字列を用いている。

例えば「こんにちは」と表示させたい時は、echo()関数を用いて

<?php
echo "こんにちは";
?>

と命令文を書く必要がある。

「”こんにちは”」の部分が文字列であり、文字列を扱う場合は、文字列を「”」または「’」で囲む方法が良く用いられる。

このルールは、関数の引数として文字列を扱う場合だけでなく、変数に代入したり、条件式で用いる場合なども同様である。(変数と条件式は別の機会に説明する。)

引用符

「’」で文字列を囲む方法は、文字列の始まりと終わりを意味する「’」を文字列に直接書きこむ事が出来ない。

しかし、「’」の前に「\」または「\」を置き、「\’」または「\‘」とすることで、文字列内に「’」を書きこむことが出来る。

※バックスラッシュ「\」は、多くの日本語フォントでは「\」と表示されるが、同じ意味であり、日本語キボード上でも「\」と表示されているが、入力は「\」で良い。

また、「\」または「\」も同様に直接記述することが出来ず、「\」または「\」を記述する場合は、「\\」または「\\」とする必要がある。

文字列に空白、改行が含まれる場合は、空白と改行は、そのまま文字列に反映される。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>引用符を使った文字列</title>
</head>
<body>
<?php
echo '\'こんにちは\'<br />';
echo '\\こんにちは\\';
?>
</body>
</html>

上記のスクリプトの実行結果を表示

以上のような「\」または「\」を使った特殊な記述を「エスケープシーケンス」と言う。

エスケープシーケンスには、「\」または「\」を文字の前に置く以外に、特別なコードで置き換える方法もあり、構文やシステム都合のよる理由で、文字そのままでは不都合が生じる場合や文字で表現できない場合は、特別な文字や機能を特別なコードで置き換えたもの使用することがあり、これら全般をエスケープシーケンスと読んでいる。

ここで言うエスケープシーケンスは、狭義のものであるが、その他のエスケープシーケンスについては、別の機会に説明する。

また、特殊な文字や機能をエスケープシーケンスで置き換えることを「エスケープする」と言う。

なお、ここまでは、「\」と「\」の両方を表記してきたが、以後は「\」をもってエスケープシーケンスを意味し、エスケープされた文字を意味するものとする。

二重引用符

文字列は、「”」で囲む場合は、文字列内でも「’」の使用が許されるが「”」を使用する際は、「\”」とする必要がある。

また引用符「’」の場合と異なり、様々なエスケープシーケンスを文字列中に使用することが出来る。

  • \n ・・・ UNIX系の改行(LF)を意味する。
  • \r ・・・ 昔のMacなどの改行(CR)を意味するが、文字列中で改行させたい時は、通常は\nを使う。
  • \t ・・・ タブ(水平タブ)を意味でする。
  • \v ・・・ 垂直タブを意味する。PHP 5.2.5以降でサポート。
  • \f ・・・ フォームフィード(FF)。PHP 5.2.5以降でサポート。
  • \$ ・・・ ドル記号。
  • \\ ・・・ バックスラッシュ。

上記以外に(アスキー)文字の8進数表記を「\nnn」、16進数表記を「\xnn」と書くことも出来る。

※nは、8進数の場合は、0から7の数字で、16進数の場合は、数字の0から9およびアルファベットのaからf。

「\n」での改行は、タグの「<br />」を意味しておらず、あくまでHTMLソース上の改行であるため、ブラウザ上で反映されるわけではない、効果を確認するためにはブラウザでソースを見ること。

例えば、PHPでHTMLタグを含む文字列を表示させる場合、「\n」を使って改行を入れるとソースも見やすくなる。

「\r\n」は「CRLF」、つまりWindowsなどの改行コードとなる。

インターネットプロトコルでは、意外にもUNIX系の「LF」でなく、DEC系の「CRLF」が使われてきた経緯もあり、改行コードとして「CRLF」が必要なケースもあり得るので、使う機会があるかもしれない。

ともかく、改行コードの扱いはシステムによって事なる場合があり、意外に曲者なので、記憶しておくとトラブルの際の助けになるかもしれない。

私の経験では、ダウンロードしたPHPのメールフォームで送信されたメールが、メーラーのよっては正常に表示されず、メールフォーム自体もインターネットの決まりごと(RFC)を順守したものだったが、決まりを順守しない方向に改行コードを変更したら、問題が解消した経験がある。

エスケープシーケンス以外の特徴として、文字列内に変数を直接記述し、変数を使用することが許される。(文字列内で変数が展開される。)

変数の直後に文字が続く場合は、変数の終わりが判断できなくなるため、「{$text}」のように「{}」で囲むと良い。

ちなみに、関数を「{}」で囲むことで、文字列内に関数の戻り値を展開することも出来るのだが、本来、仕様にない事かもしれないので、使わない方が良いかもしれない。

文字列に空白、改行が含まれる場合は、空白と改行は、そのまま文字列に反映される。

以下のサンプルでは「変数」を使用しているが、変数については別の機会に説明する。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>二重引用符を使った文字列</title>
</head>
<body>
<?php
$text = "エスケープ";
echo "'\\こんにちは\\'<br />";
echo "こんにちは<br />\nさよなら<br />";
echo "\x41BC<br />";
echo "$text する<br />";
echo "{$text}sequence";
?>
</body>
</html>

上記のスクリプトの実行結果を表示

ヒアドキュメント構文

「”」や「’」で囲む代わりに文字列を「<<<ID」と「ID」で囲んでも良い。 これは、「ヒアドキュメント」と呼ばれる文字列を扱うための構文で、「ID」の部分は、任意の文字で置き換えることが出来る。 echo()関数と組み合わせて使うと下記のようになる。

<?php
echo <<<TEXT
こんにちは
"おはよう" と言う
TEXT;
?>

この構文は、複数行に渡る文字列を扱う場合に都合が良い。

ヒアドキュメント構文を使う際は、「<<<ID」直後で改行すること。

「ID」には、アルファベット、数字およびアンダースコアが使用できるが、最初の1文字は、アルファベットまたはアンダースコアでなければならない。

※PHP 5.3.0以降では、「<<<」の直後に来る「ID」のみ「”」で囲んで「”ID”」としても良い。

文字列の終わりを表す「ID」の前に空白やタブ、その他の文字を記述してはいけない。

加えて、文字列の終わりを表す「ID」の後ろに記述が許されるのは、命令文の終わりを表す「;」のみである。

ヒアドキュメント構文は、内部的には「”」で囲まれた文字列として処理されため、エースケープシーケンスや変数も使用できる。

しかし、文字列中に「”」を使用する場合もエスケープする必要はなく、直接、「”」と記述して良い。

文字列中に空白や改行を含む場合、空白はそのまま反映されるが改行は無視される。

Nowdoc構文

Nowdoc構文は、PHP 5.3.0以降でサポートされている。

この構文は、ヒアドキュメント構文と殆ど同じであるが、「<<<」の直後に来る「ID」を「’」で囲んで「<<<’ID’」とする必要がある。

<?php
echo <<<'TEXT'
こんにちは
'おはよう' と言う
TEXT;
?>

基本的なルールは、ヒアドキュメント構文と同じである。

ただし、Nowdoc構文は、内部的には「’」で囲まれた文字列として処理されため、変数は使えず、利用可能なエスケープシーケンスも文字列を「’」で囲む場合と同じである。

しかし、文字列中に「’」を使用する場合もエスケープする必要はなく、直接、「’」と記述して良い。

文字列中に空白や改行を含む場合、空白はそのまま反映されるが改行は無視される。

ヒアドキュメント構文、Nowdoc構文を使用したスクリプトの実行結果を表示

文字列の連結

「”」や「’」で囲まれた文字列を下記の要領で「.」を使って連結して、1つの文字列として扱うことが出来る。

'文字列1'.'文字列2'.'文字列3'
"文字列1"."文字列2"."文字列3"

下記のサンプルでは、echo()関数を使って連結した文字列をブラウザに表示させている。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>文字列の連結</title>
</head>
<body>
<?php
echo 'こんにちは '.'さよなら';
?>
</body>
</html>

上記のスクリプトの実行結果を表示

Posted in PHP, PHP講座, ネット・PC | Tagged | 2 Comments

初心者による初心者のためのPHP講座 第2回 PHPの基本構造

第2回では、PHPプログラムの基本構造について説明する。

プログラミング環境の準備

前回、テキストエディタの準備が必要であることを書いたが、「TeraPad」を例に話を進めてゆく。

インストールが完了したら、まず、文字コードと改行コードの設定しておくと良いだろう。

「TeraPad」の場合は、「表示」メニューから「オプション」を実行し、「文字コード」タブを開くと、ファイルを開いた際の文字コードである「初期文字コード)」保存する際の文字コードである「保存文字コード」の設定が出来るようになっているので、それぞれ設定しておく事。

テキストにマルチバイト文字を含まない限り、文字コードの「自動判別」は効かないので、意識しなくとも意図した文字コードで保存されるようにするためにも必要な設定である。

PHPは、Unix環境で動作させる事が多い事もあり、

文字コード:EUC(EUC-JP)、 改行コード:LF

が使われることが多く、これは無難な設定である。

私の場合は、WordPress用のプラグインを作ることが多く、ウェブサイトもUTF-8で記述する事が多いので、

文字コード:UTF-8N(UTF-8、BOMなし)、改行コード:LF

に設定しており、この講座は、この設定を前提に話を進めてゆく。

ファイルの拡張子

PHPで記述されたコードを含むファイルの拡張子は、原則として「php」とする必要がある。

ファイル名には、半角英数字を使用し、区切りが必要な場合は「.」や「-」、「_」を使用する。

そして「.php」で終わるようすること。

アップロードと実行

PHPで記述されてファイルは、HTMLで記述されたファイル同様に、ウェブサーバーにアップロードすれば良い。

拡張子は異なるものの、実行もHTMLの場合と全く同じ要領であり、「http://example.com/index.php」のようなURLをブラウザに入力してアクセスすれば良い。

基本構造

PHPは、下記のようにHTMLに簡単に組み込むことが出来る。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHPの基本構造</title>
</head>
<body>
<p>PHPで日付を表示します。</p>
<p>今日は、<?php echo date("Y/m/d"); ?> です。</p>
</body>
</html>

上記のスクリプトの実行結果を表示

PHPによる記述は、

<?php PHPでの記述 ?>

の部分であり、PHPのプログラムは、「<?php」で始まり「?>」で終わる必要がある

この「<?php」と「?>」に囲まれた間に、PHPで命令文を記述してプログラムを作成する。

複数の命令文を書く事も可能で、「;」が命令文の区切りを表し、各命令文の最後には「;」を付ける必要がある。

例外として「?>」の直前の命令文は「;」を省略することが出来るが、命令文には「;」を付けることを習慣とした方が良い。

また、「<?php」と「?>」で囲まれたPHPプログラムは、1つのファイル内で複数回登場しても良い。

逆に「<?php」と「?>」に囲まれない範囲にあるHTMLによる記述は、そのままHTMLとして処理される。

つまり、HTMLとPHPを、簡単に混在させることが出来る。

サンプルプログラムでは、下記のコードで、現在の日付を動的に表示している。

<?php echo date("Y/m/d"); ?>

ここでは、echo()date()と言う2つの関数を使用している。

「関数」とは、「与えられた値(引数)を元に処理を行い、結果(戻り値)を返す」という役割を担う命令文で、PHPプログラム内の処理の中心となる構造物である。

関数を電子レンジに例えるなら

  • 引数・・・温める時間。
  • 処理・・・物を温める。
  • 戻り値・・・加熱の終了を知らせる音。

と言ったところだろうか。

シンプルな時計は、引数を必要としないが、時刻の計算処理を実行し、戻り値として現在の時刻を常に返すと言えるかもしれない。

実際、サンプルスクリプトでも使用しているdate()関数は、時計と似ている。

関数は、通常、下記のように記述する。

関数名(引数)

サンプルプログラムを見るとechoには「()」が無く、これは関数のルールから外れているように思えるが、echo()の場合は「()」を省略出来る。

「()」が省略できるのは、echo()は厳密には関数ではなく、「言語構造」と呼ばれるものであるためだが、ともかく、echo()は、こう言うものと理解しておこう。

ただし、ここでは便宜上、関数として扱う。

echo()の「()」を省略せずに

<?php echo(date("Y/m/d")); ?>

と書くことも出来るが、通常は、このような書き方はしない。

date()関数は、現在の日付を計算する関数で、引数として日付のフォーマット(Y/m/d)を関数に渡し、戻り値として現在の年月日を返させている。

echo()関数は、引数をブラウザに表示する処理を行う。

この場合、echo()関数の引数は、date()関数の戻り値であり、結果としてブラウザには、現在の年月日が「/」区切りで表示される。

このサンプルプログラムでは、date()関数の引数に文字列(別の機会に詳しく)を使用しているが、文字列は「”」や「’」で囲むなどする必要がある。

関数には、引数、処理、戻り値の3つが必ずしもセットになっているとは限らない。

例えば、echo()関数は、引数を必要とし、引数をブラウザに表示する処理を行うが、戻り値は返さない。

echo()関数と同等の処理を行う関数として、print()関数があるが、こちらは戻り値を返す。

ちなみにprint()も厳密には関数ではなく、言語構造。

echo()関数やdate()関数は、PHPで予め定義された関数で、同様の関数は他にも沢山あり、「関数リファレンス」で見つけることが出来る。

※関数リファレンスでは、「引数」は「パラメーター」、「戻り値」は「返り値」と表記されている。

このような定義済み関数の他に、自身で関数を定義して使用することも出来る。

サンプルプログラムでは、下記にもPHPを使用している。

<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>

これは、

<?xml version="1.0" encoding="utf-8"?>

に含まれる「<?」という構造が、PHPであると誤って解釈されるため、直接記述した場合は、(PHPではないため)エラーになってしまう。

そこで、echo()関数を使って表示させるようにしてる。

また、metaタグで文字コードを「UTF-8」に指定しているが、この場合は、この「.php」ファイルは、UTF-8で保存されなければならない。

空白や改行は無視される

PHPプログラムが実行される際、プログラム中の空白(タブも)や改行は無視され、意味を持たない。

以下の4つの文は、全く同じ意味になる。

<?php echo "今日の日付は "; echo date("Y/m/d"); echo " です。"; ?>
<?php
echo "今日の日付は ";
echo date("Y/m/d");
echo " です。";
?>
<?php
echo
"今日の日付は ";
echo date("Y/m/d");
echo " です。";
?>
<?php
	echo "今日の日付は ";
	echo date("Y/m/d");
	echo " です。";
?>

言い換えれば、プログラムが見やすいように改行したり、インデントすることが許されている。

ただし、「”」や「’」で囲まれるなどした文字列中の空白や改行は無視されない。

上記の4つの例でもecho()関数の引数が、空白を含む文字列になっているが、ブラウザ上でも空白として表示される。

次の例は、上記の4つの例とは異なる意味を持つ。

<?php
echo
"今日の
日付は ";
echo date("Y/m/d");
echo " です。";
?>

ブラウザ上では「今日の」と「日付は 」の間に改行が入って表示される。

コメント文

PHPでは、コメント文を書くことが出来る。

コメント文は、PHPプログラムが実行される際には、無視され、処理結果に影響を与えない。

コメント文は、プログラム中にどんな処理をしているかなどの情報を残す時、命令文の一部を一時的に処理から省きたい時に便利である。

「#」や「//」で始まる行はコメントと見なされる。

<?php
echo
"今日の日付は ";
// 今日の日付を表示
echo date("Y/m/d");
echo " です。";
?>
<?php
echo
"今日の日付は ";
echo date("Y/m/d");
// echo " です。";
?>

「/*」と「*/」で囲まれた範囲もコメントとして見なされ、複数行に渡ってコメントを書く場合などに便利である。

<?php
/*
今日の日付を表示するプログラム
by redcocker
/*
echo "今日の日付は ";
echo date("Y/m/d");
echo " です。";
?>

命令文の実行順序

PHPの命令文は、どのような順序で実行されるのだろうか?

それは次のサンプルスクリプトの実行結果からも予想出来る。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>命令文の実行順序</title>
</head>
<body>
<?php
echo "<p>これは1番目</p>";
echo "<p>これは2番目</p>";
echo "<p>これは3番目</p>";
?>
</body>
</html>

上記のスクリプトの実行結果を表示

echo()関数によって、ブラウザに表示される文字は、スクリプトの記述の順番通りであることが分かる。

つまり、PHPで記述されたスクリプトは、上から順に実行される。

PHPの限界

次のサンプルプログラムは、最初のサンプルプログラムを少し改造したものである。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHPの限界</title>
</head>
<body>
<p>PHPで日付と時刻を表示します。</p>
<p>今日は、<?php echo date("Y/m/d l H:i:s"); ?> です。</p>
</body>
</html>

上記のスクリプトの実行結果を表示

このサンプルプログラムでは、date()関数の引数を変更し、日付だけでなく、曜日、時刻まで表示されるようにしている。

PHPは、ブラウザからページが参照されたタイミングで実行され、ページがブラウザに表示された時点でPHPの実行は終了している。

date()関数を使って時刻を取得したとしても、それは実行のタイミング、つまり、ブラウザでURLを入力してページをリクエストし、ページが表示されるタイミングの時刻であり、リアルタイムで秒の部分が変化するわけではない。

リアルタイムで時刻を表示させようと思うと、PHPではなく、Javaスクリプトで記述されたプログラムを使うなどする必要がある。

PHPを実行させるには、ブラウザでPHPで記述されたページを表示するか、再読み込みする必要がある。

これはPHPの仕様であり、制限でもある。

PHPだけに固執するのではなく、HTML、PHP、Javaスクリプトなどを組み合わせることで、機能的なサイトを構築することが出来ると言える。

Posted in PHP, PHP講座, ネット・PC | Tagged | 1 Comment

テキストエリアのソースコードの強調表示に適した「CodeMirror」

この記事で紹介する「CodeMirror」は、<textarea>タグを使ったテキストエリアに表示されるソースコードの強調表示に適したJavaスクリプトライブラリである。

公開中のWordPress用プラグイン「CodeMirror for CodeEditor」でも、このライブラリを使用している。

WP SyntaxHighlighter」でも、同様にソースコードを強調表示する「SyntaxHighlighter」と言うライブラリを使用しているが、「SyntaxHighlighter」が任意の場所のソースコードを対象しとているのに対して、「CodeMirror」は、<textarea>タグを使ったエディタ上のソースコードの強調表示に適している。

「WordPress」を例に上げると、「SyntaxHighlighter」が記事内のソースコードなどフロントエンドの強調表示に適しているのに対して、「CodeMirror」は、ダッシュボード上のテーマエディターやプラグインエディターに適していると言える。

テキストエディタでも、強調表示に対応したものが多いが、「CodeMirror」は、それと同様の事をウェブベースのテキストエディタ上で実現できる。

CodeMirrorによる強調表示

「CodeMirror」は、バージョン0.x系のリリースが続いた後に「CodeMirror 1.0」と「CodeMirror 2.0」が同時にリリースされているが、「1.0」と「2.x」ではAPIに違いがあるので互換性がない。

作者によると、今後は「CodeMirror 2.x」の方に力を入れていくようであるため、この記事では、「CodeMirror 2.x」について書く。

「CodeMirror」は、制限が少ないMITライセンスと互換性があり、様々なシステムの中で利用し易い。

「CodeMirror 2.x」には、コアのJavaスクリプト、コアのCSSの他、見た目を変えるための各テーマ用のCSS、各言語を定義したJavaスクリプトが含まれている。

ダウンロードファイルのうち、実際に必要なファイル群は、下記の通りである。

  • libフォルダ・・・基本的なJavaスクリプトとCSS。
  • themeフォルダ・・・各テーマ用CSS。
  • modeフォルダ・・・各言語を定義したJavaスクリプト。

ウェブサイトへの導入は、それほど難しくない。

まず、ヘッダ部分で下記のCSSとスクリプトを読み込む。パスは自身の環境に合わせて変更すること。

<link rel="stylesheet" href="lib/codemirror.css">
<link rel="stylesheet" href="theme/default.css">
<script src="lib/codemirror.js"></script>
<script src="mode/css/css.js"></script>
<script src="mode/javascript/javascript.js"></script>
<script src="mode/xml/xml.js"></script>
<script src="mode/htmlmixed/htmlmixed.js"></script>

「codemirror.css」は、コアのCSSであり、読み込みは必須。

上記の例では、テーマは「default」を使用しているが、他のテーマを使用する場合は、「default.css」に加えて、そのテーマのCSSを読み込むようにする。

「codemirror.js」が、コアのJavaスクリプトになる。

4行目以降で、言語を定義するJavaスクリプトファイルを読み込む。

例では、CSS、Javaスクリプトが混在したHTMLを強調表示するために「htmlmixed.js」を使っているが、この場合は「css.js」、「javascript.js」、「xml.js」の後で読み込む必要がある。

このように「CodeMirror」では、複数の言語が混在するテキストを強調表示することも出来る。

PHPなどC言語に近い構文を持つ言語をサポートする「clike.js」を使う際にも、Javaスクリプトを読み込む順序が問題になるが、言語を定義するJavaスクリプトと同じフォルダに実行サンプルの「index.html」が収まっているので、このソースを確認すると良いだろう。

続いて、ページの後半、テキストエリア部分より後ろに、下記を記述を追加する。

<script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
	mode: "text/html",
	theme: "default",
	indentUnit: 4,
	indentWithTabs: false,
	tabMode: "shift",
	enterMode: "keep",
	electricChars: false,
	lineNumbers: true,
	firstLineNumber: 1,
	gutter: false,
	fixedGutter:false,
	matchBrackets: true
});
</script>

2行目で、<textarea>タグのid属性の属性値を記述する。例では「code」になっている。

3行目以降は、パラメーターの定義である。

以下に、パラメーターの一部をまとめる。

  • mode・・・言語を言語名またはMINEタイプで指定。値:”javascript”、”text/javascript”等。
  • theme・・・テーマを指定。値:”default”/”cobalt”/”eclipse”/”elegant”/”neat”/”night”。
  • identUnit・・・タブによるインデントのサイズを半角スペースの数で指定。値:数値。
  • indentWithTabs・・・行の先頭の半角スペース8個分が1つのタブで置き換えられる。値:true/false。
  • tabMode・・・Tabキーを押した時の動作を指定。値:”classic”/”shift”/”indent”/”default”。
  • enterMode・・・改行した時の動作を指定。値:”indent”/”keep”/”flat”。
  • electricChars・・・構文上、意味を持つ「{ }」などが入力された際に、自動的にインデントする。値:true/false。
  • lineNumbers・・・行番号の表示、非表示。値:true/false。
  • firstLineNumber・・・行番号の開始番号。値:true/false。
  • gutter・・・「gutter」は、行番号の表示エリアを指すが、厳密には、行番号をクリックすることで印を付ける事が出来るマーカーエリアの表示、非常の指定。「true」ならlineNumbersが「false」の場合も「gutter」は表示される。値:true/false。
  • fixedGutter・・・「true」なら水平スクロールバーでスクロールしても、「gutter」は表示されたままになる。値:true/false。
  • matchBrackets・・・「true」なら「(」、「)」、「{」、「}」、「[」、「]」が選択された時に、対応する括弧と共に強調表示する。値:true/false。

なお、動作と記述は、配布サイトのデモページやダンロードファイルのdemoフォルダ内のファイルで確認できる。

以下のサンプルでは、ドロップダウンリストでテーマの変更、「Esc」または「F11」キーで、通常モード/フルスクリーンモードの切り替えが可能になっている。

<!doctype html>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CodeMirror 2</title>
<link rel="stylesheet" href="lib/codemirror.css">
<link rel="stylesheet" href="theme/default.css">
<link rel="stylesheet" href="theme/neat.css">
<link rel="stylesheet" href="theme/elegant.css">
<link rel="stylesheet" href="theme/night.css">
<link rel="stylesheet" href="theme/cobalt.css">
<link rel="stylesheet" href="theme/eclipse.css">
<script src="lib/codemirror.js"></script>
<script src="mode/css/css.js"></script>
<script src="mode/javascript/javascript.js"></script>
<script src="mode/xml/xml.js"></script>
<script src="mode/htmlmixed/htmlmixed.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<style type="text/css">
	.CodeMirror {
		width: 800px;
		}
	.fullscreen {
		position: fixed;
		top: 50px;
		left: 0;
		width: 100%;
		height: 100%;
		z-index: 100;
	}
</style>
</head>
<body>
<p>Select a theme: <select onchange="selectTheme(this)">
	<option selected>default</option>
	<option>night</option>
	<option>neat</option>
	<option>elegant</option>
	<option>cobalt</option>
	<option>eclipse</option>
</select>
</p>
<form>
<textarea id="code" name="code">
<html style="color: green">
<!-- this is a comment -->
<head>
<title>HTML</title>
<style type="text/css">
	h1 {font-family: comic sans; color: #f0f;}
	div {background: yellow !important;}
	body {
	max-width: 50em;
	margin: 1em 2em 1em 5em;
	}
</style>
</head>
<body>
<h1>Sample Code</h1>
<div class="content">
	<p><a href="http://codemirror.net/">CodeMirror 2.x by Marijn Haverbeke and released under a MIT-style license.</a></p>
</div>
<script>
	function jsFunc(arg1, arg2) {
		if (arg1 && arg2) document.body.innerHTML = "achoo";
	}
</script>
</body>
</html></textarea>
</form>
<script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
	mode: "text/html",
	theme: "default",
	indentUnit: 4,
	indentWithTabs: false,
	tabMode: "classic",
	enterMode: "indent",
	electricChars: true,
	lineNumbers: true,
	firstLineNumber: 1,
	gutter: true,
	fixedGutter: true,
	matchBrackets: true,
	onKeyEvent: function(i, e) {
		// Hook into F11
		if ((e.keyCode == 122 || e.keyCode == 27) && e.type == 'keydown') {
			e.stop();
			return toggleFullscreenEditing();
		}
	},
	onGutterClick: function(cm, n) {
		var info = cm.lineInfo(n);
		if (info.markerText)
			cm.clearMarker(n);
		else
			cm.setMarker(n, "<span style=\"color: #900\">●</span> %N%");
		}
});

function selectTheme(node) {
	var theme = node.options[node.selectedIndex].innerHTML;
	editor.setOption("theme", theme);
}

function toggleFullscreenEditing() {
	var editorDiv = jQuery('.CodeMirror-scroll');
	if (!editorDiv.hasClass('fullscreen')) {
		toggleFullscreenEditing.beforeFullscreen = { height: editorDiv.height(), width: editorDiv.width() }
		editorDiv.addClass('fullscreen');
		editorDiv.height('100%');
		editorDiv.width('100%');
		editor.refresh();
	} else {
		editorDiv.removeClass('fullscreen');
		editorDiv.height(toggleFullscreenEditing.beforeFullscreen.height);
		editorDiv.width(toggleFullscreenEditing.beforeFullscreen.width);
		editor.refresh();
	}
}
</script>
</body>
</html>

フルスクリーンモードへの切り替えのために「onKeyEvent」、マーカーの表示のために「onGutterClick」というパラメーターを使用しているが、「CodeMirror」では、同様のパラメーターが他にも用意されており、イベント発生時の処理を定義出来るようになっている。

なお、フルスクリーンモードへの切り替えは、「jQuery」に依存している。

上記の例では、「jQuery」を「Google Libraries API」を利用してネットから読み込んでいるので、オフラインでは動作しない。

Posted in ネット・PC | Tagged | Leave a comment

初心者による初心者のためのPHP講座 第1回 PHPとは

WordPressのカスタマイズやプラグインを作成する事を目的に、2011年の4月から独学で「PHP」について勉強を始めた。

「PHP」は、簡単とは言われているが、私の場合は、海外在住のため日本語の書籍も簡単に手に入るわけではなく、インターネットの情報や既存のプログラムのソースコードを元に学んだため、苦労は無かったとは言えないが、最初の作品となるWordPress用プラグイン「Add attrib for LightBox」を意外と簡単に完成させられたこともあり、その後もPHPでの開発を継続している。

実際、最初につまずくと、先へ進めないものである。

そこで「初心者による初心者のためのPHP講座」と題して、私の経験を交えた「PHP入門書」をブログ上で作成してみることにした。

これは、私の勉強にもなる。

私がPHPを勉強し始めたきっかけが「WordPress」であり、PHPを使って作成しているものが「WordPress」用のプラグインであるため、一般的なPHPの話と言うよりは「WordPress」寄りの内容になるだろう。

どこまで出来るか分からないが、これからPHPを学ぼうとする方の手助けになれば幸いである。

なお、「初心者による初心者のためのPHP入門」の投稿は、不定期に行う。

PHPとは

PHP」は、「PHP: Hypertext Preprocessor」の略で、動的にHTMLを生成することが出来る開発言語である。

要は、PHPを使えば、HTMLだけで記述した場合と比較して、より高機能なHPを簡単に構築することが出来る。

・PHPの特徴

  • ウェブサイト、ウェブアプリケーションの開発に特化。
  • サーバー上で実行される。
  • C言語の影響を受けた構文で、平易な文法。
  • データベースとの連携が容易。
  • スクリプト言語なので大げさな開発環境が不要。

PHPは、1995年にバージョン1.0が登場しており、開発言語としては歴史はそれほど古くない。

にも関わらず、文法が易しいこともあり、広く普及している。

ユーザーが多いということは、書籍やインターネットを通じて情報を得やすいと言う利点もある。

PHPは、ウェブサイト、ウェブアプリケーションの構築に特化した開発言語であり、「PHP」同様に動的なサイトの構築に用いられる事が多い「Perl」とはこの点で異なる。

ウェブサイト上の掲示板、お問い合せフォームなどはPHPで記述できるウェブアプリケーションの例である。

PHPで記述されたアプリケーションの中でも比較的、大規模なものの例を挙げると、「WordPress」やWikipediaで使われている「MediaWiki」、ショッピングカートの「Zen Cart」、「EC CUBE」などがある。

データベースとの連携が容易であることも特徴で、データを「MySQL」などのデータベースという外部の入れ物に保存し、必要に応じて取り出して利用することが出来る。

HTMLでは、表示する内容は全てHTML上に含める必要があるが、PHPの場合は、本文をデータベースに格納し、サイトにアクセスがあった際に、データベースから取り出し、必要に応じて加工した上でブラウザに送信することも可能である。

実際、多くのPHPプログラムがデータベースと連携している。

・PHPで出来ることの例

  • コメントを受け取り、表示する。しかし、危険な部分は、不適切な部分は削除して表示したい。 ⇒ HTMLでは、データを受け取れないし、処理できない。
  • フォームから入力されたデータを整形して管理者にメールで送信する。 ⇒ HTMLでは、データを処理できないし、メールも送信できない。
  • ユーザーの環境に合わせて、自動的に異なる言語のページを表示する。 ⇒ HTMLでは、リンクなどで対応するしかない。

必要な予備知識

PHPは、比較的、敷居の低い開発言語かとは思うが、全くの予備知識なしに学べるものではない。

参考までに私のケースを挙げておくが、PHPを勉強し始める以前にも、HTMLとCSSは、それなりに書け、PerlとJavaスクリプトも少し書けたが、Perlの方は、長い間使っていないので、かなり忘れてしまっていた。

・必要な予備知識

  • HTML
  • CSS
  • 英語(必須ではないが、開発の幅広がる。)

PHPは、ウェブアプリケーションを構築する言語であるため、「HTML」や「CSS」に関する知識は不可欠である。

テキストエディターを使って、HTMLで構造を記述し、CSSでレイアウトして、HPを作ることが出来る方なら全く問題ないだろう。

予備知識として「英語」を上げたのは、PHPに限らず、情報を公開する上での標準言語になっているからだ。

PHPやその他の言語で記述された数多くのプログラムがオープンソースの形で公開されており、自身が作るPHPプログラムに、それらを機能の一部として取り込む事も可能である。

実際に、他にプログラムとの連携を目的とした「ライブラリ」と呼ばれるプログラムも数多く存在する。

それらを利用したいとと思った場合、仕様の解説文を読む必要がある。

しかし、これらは英語で記述されていることが多い。

逆に英語以外の言語で仕様をまとめると、そのプログラムは、世に広まり難いといえるので、ネイティブでない開発者であっても英語で記述している場合が多い。

つまり有名なもの、実績があり、安心できるものを求める場合は、英語は避けて通れない。

「WordPress」のように多言語に翻訳されているものばかりなら良いのだが、実際には、そのようなケースは稀である。

また、自身で開発したプログラムを公開する場合も、仕様や解説文を英語で書いた方が、利用者が獲得しやすく、フィードバックも得られやすい。

プログラミングとは

さて、プログラムを初めて経験する方にとっては、プログラムとは何かすら分からな状況かもしれない。

プログラムは、基本的に「文章」である。

「俳句を作る」、「Twitterにつぶやく」事と、本質的には変わらない。

「俳句」は定型文であり、ルールがある。

また、Twitterにも文字数制限があり、RT、ハッシュなどの流儀がある。

プログラムをこれと全く同じであり、一定のルールに従って文章を作れば良い。

「俳句」、「Twitterのつぶやき」は、ルールに従った上で、人間が理解出来る言葉で書けばよいが、プログラムは、誰に理解できる言葉で記述すべきであろうか?

答えは、PCなどの内蔵されている中核の処理装置「CPU」である。

CPUの理解できる言葉は、マシン語と呼ばれ、0と1と組み合わせである2進数(通常は、16進数で表記)である。

しかし、マシン語で記述されたプログラムなど理解が容易なはずがない。

小規模なアプリケーションが主流だった、古き良き時代には、個人が作るアプリケーションであってもマシン語で記述していたこともあるが、現在の大規模なアプリケーションでは、それも困難である。

また、マシン語は、1つではなく方言があり、CPUの種類毎に異なるため、1つのCPUのマシン語を覚えたからといって、別のCPUのマシン語が簡単に書けるわけではない。

ちなみに私は、インターネットもまだ無く、キャプテンシステムとか騒いでいた古き良き時代にマシン語(アセンブリ言語)を勉強しようとして挫折した。

実際の開発では、C言語のような、より人間が話す言葉に近く、CPUの差を吸収してくれる高級言語(中級言語)と呼ばれる開発言語が使われることが多い。

しかし、C言語は、あくまで人間寄りの言葉であって、C言語で記述されたファイルは、CPUには理解出来ないので、そのままでは実行する事も出来ない。

そこで、C言語で記述されたプログラムは、「コンパイラ」と呼ばれるプログラムを用いてCPUが理解出来る実行形式に変換する作業(コンパイル)を行う必要がある。

※開発言語で書かれた元のファイルをソースファイル、その中の記述をソースコード、コンパイル後のファイルをバイナリと呼ぶ。

通常、プログラムは、ソースコードのままで提供されるのではなく、コンパイルされ、実行形式に変換されて提供、販売されるため、私たちも簡単に利用することが出来る。

それに対してPHPの場合は、バイナリと言った概念は存在しない。

人間寄りの言葉で書かれたソースコードをそのまま実行させる。

では、どのように実行しているかと言うと、実行する際にインタプリタと呼ばれる翻訳機を通すことで、CPUが理解できる言葉に変換し、実行を可能としている。

この方法は、通訳を通して会話するようなものであるため、コンパイルされたバイナリに比べて実行速度が落ちると言う欠点もある。

プラグラムは、コンパイルやインタプリタによる翻訳が必要であるため、プログラミング言語には、一定のルールが必要となる。

翻訳を考えれば、柔軟な人間の言葉よりも、人間寄りの言葉ではあるが、人間の言葉とは異なったシンプルなものの方が都合が良い。

人間の言葉では、同じような意味の事柄を異なった言い回しで表現出来る。

つまり、「画面を表示して頂けますか?」、「画面を表示して下さい。」、「画面を表示しろ!」よりもプログラム言語では、「表示 画面」などの方が遥かに都合が良い。

また、構文も人間の話す言葉に準じるよりも、効率的にプログラムを書く事を優先した方が良い。

その辺りがプログラム言語を難しく見せている理由ではあるかとは思うが、より柔軟な言語である「英語」を学ぶことよりも遥かに易しいとも言える。

開発環境の準備

C言語での開発の場合、コンパイラを必要とし、コンパイルという余計な作業が発生するのに対して、PHPでは、コンパイラは不要であり、コンパイルが不要な分、楽であるとも言える。

つまり、PHPの場合は、特別な開発環境は不要である。

PHPのプログラムは、テキスト形式のファイルで保存する必要があるため、文章を書くための紙に相当するテキストエディタ(シンプルなワープロ)さえあれば良い。

これから、PHPによるプログラミングを始めるなら、必ず、テキストエディタの準備が必要になるが、お金を必要はなく、フリーのもので十分である。

ただし、文字コード、改行コードが選択できるもの使うこと、例えば、Windowsのメモ帳は不可である。

参考:Windows用のテキストエディタを比較

WordPress用のテーマ、プラグインを作成するなら、「UTF-8、BOMなし」で保存できるものにすること。

私は、シェアウェアの「秀丸エディタ」を使っているが、Window用ならフリーの「TeraPad」で十分なので、ダウンロードしてインストールしておくこと。

今後、エディタの操作などは、「TeraPad」を標準して書くようにする。

PHPの実行と実行形態

PHPが翻訳され、実行されることは先に書いたが、つまり、そんための環境が必要となる事を意味している。

では、具体的にどこで翻訳され、実行されるのだろうか?

PHPのプログラムは、ウェブサーバー上で翻訳され、プログラムに従って処理を実行し、実行結果をHTMLとしてブラウザに送信するパターンが基本となる。

ウェブサーバーには、「Apache」などのウェブサーバーアプリケーションがインストールされており、このアプリケーションの働きにより、HPにアクセスがあれば、HTMLで記述されたデータがブラウザに送信され、閲覧者はHPを参照できるが、これだけではPHPの実行までは出来ない。

更にオプションとして「PHP」を加えることで、PHPで記述されたサイトの出力も可能となる。

PHPで記述されたプログラムは、Apacheなどのウェブサーバーアプリケーション自身が実行するか、ウェブサーバーアプリケーションが、PHPを解釈、実行できるPHPプログラムを起動して代わりに実行させている。

前者のようなPHPの実行に仕方は、PHPがウェブサーバーアプリケーションの一部(モジュール)として組み込まれている場合にのみ可能であり、実行が高速である。

後者のような方法は、CGIと呼ばれ、ウェブサーバーが、逐次、PHPプログラムを起動する必要があるため実行が遅くなる。

PHPは、ウェブサーバー上で動作するため、PHPを利用するためには、PHPをサポートするレンタルサーバーの契約が必要となる。(PC上で動作される方法もあるが割愛する。)

これは、一般的なウェブサイトを構築するために借りるレンタルサーバーで問題ない。

PHPをサポートしないレンタルサーバーを探すほうが難しいであろうから、PHPのサポートの有無については、あまり心配はいらないだろう。

PHPと単にいう場合は、PHPで記述されたプログラムを指すことが多いが、ウェブサーバーにインストールされているPHPを実行するためのプログラム(PHPランタイム)を指すこともあり、こちらがPHPのコアとも言える。

ウェブサーバーにインストールされているPHPにもバージョンがあり、できる限り新しいバージョンのものがインストールされているサーバーが好ましいが、レンタルサーバー会社側の都合にもよるので、最新のものが利用できるとは限らない。

新しいバージョンのPHPでは、機能が拡張されており、新しいバージョンで追加された機能を使ったPHPプログラムは、古いバージョンのPHPでは動作しないので注意が必要だ。

例えば、「WordPress 3.2.1」は、「PHP 5.2.4」以上がインストールされたサーバーでなければ正常に動作しない。

CGIとモジュール

一般的な共用レンタルサーバーの場合、PHPは、CGIとして実行されるパターンが多い。

詳しくは書かないが、これはセキュリティ上の問題を考慮してのことだ。

モジュールとして組み込まれているレンタルサーバーもあるが、セキュリティ上の問題で、通常は、PHPをセーフモードで動作させている。

セーフモードには制限があるため、許可されない関数や操作が生じてしまう。

PHPに慣れるまでは、CGIとしてPHPが動作するレンタルサーバーの方が無難かもしれない。

他に勉強すべき事

PHPの知識だけでは、目的とするプログラムを完成させることは難しいかもしれない。

予備知識としてあれば、なお良いが、下記についても並行して学ぶ必要がある。

  • SQL文などSQLに関する基礎的な知識
  • Javaスクリプト
  • セキュリティ

PHPのプログラムは、データベースと連携することが多いため、「SQL」に関する基礎的な知識は欠かせない。

また、現在のウェブサイトは、「Javaスクリプト」は欠かせない技術の1つとなってるため、出来れば並行して勉強したほうが良い。

ちなみに個人的は感想では、「Javaスクリプト」の方が「PHP」より難しい。

最後の「セキュリティ」に関してだが、PHPは、平易な文法であるため、初心者でも掲示板程度のプログラムを書くことは難しくない。

反面、セキュリティ面で脆弱なプログラムを作ってしまいかねないので、どのような攻撃が存在し、どのような対処方法があるかは知っておく必要がある。

具体的には、「クロスサイトスクリプティング(XSS)」、「クロスサイトリクエストフォージェリ(XSRF)」、「SQLインジェクション」、「ディレクトリトラバーサル」などだ。

WordやExcelのようなデスクトップアプリケーションと異なり、掲示板、お問い合せフォームなどのウェブアプリケーションは、不特定多数が利用することが多いので、セキュリティ上も危険であることを忘れていはいけない。

Posted in PHP, PHP講座, ネット・PC | Tagged | Leave a comment

CodeMirror for CodeEditor バージョン0.3 リリース

「CodeMirror for CodeEditor バージョン0.3」をリリースした。

Ver.0.3 2011/10/09

最新の「CodeMirror for CodeEditor」をダウンロード

バージョン0.3では、設定画面を設け、各パラメーターの設定が可能になった。

CodeMirror for CodeEditor 設定画面

これによって、デフォルトのテーマの選択、行番号の表示/非表示、インデントの設定などが可能になっている。

Posted in WordPress, ネット・PC, 自作アプリ | Tagged , , , | Leave a comment

CodeMirror for CodeEditor バージョン0.2 リリース

「CodeMirror for CodeEditor バージョン0.2」をリリースした。

Ver.0.2 2011/10/03

最新の「CodeMirror for CodeEditor」をダウンロード

バージョン0.2では、「テーマエディター」、「プラグインエディター」に、検索、置換機能を付加するツールバーが追加された。

CodeMirror for CodeEditor バージョン0.2 プラグインエディター

また、関数などの入力を補完する「オートコンプリート」を搭載した。

CodeMirror for CodeEditor 0.2 オートコンプリート

これによって、標準の「テーマエディター」、「プラグインエディター」が、コードエディターとして、より使い易いものになっている。

テーマに関しても、フルスクリーンモード切替時の制限を無くし、フルスクリーンモードでの切り替えもサポートした。

Posted in WordPress, ネット・PC, 自作アプリ | Tagged , , , | Leave a comment