作成した記事ページの一覧は、別ファイルに保存しておくと色々と便利です。(というよりも記事の編集や「最新の記事」機能、「次の記事」機能などをつける際には必須)
そこで今回は作成した記事ページを pages.dat に
ページID<>ページタイトル
の形式で保存していくスクリプトを考えます。
<?php $template = "template.php"; // テンプレートファイル名 $pagelog = "pages.dat"; // 作成したページ一覧を保存するファイル if ($_POST{"honbun"}) { ・・・・ // メッセージ表示 if (createNewPage( $filename, $template, $originaltag)) { recordPages( $pageid, $pagetitle); // ページを保存 echo $filename. "を生成し、書き込みを行いました。"; } ・・・・ } // ※1 作成したページをページ一覧に保存 function recordPages( $pageid, $pagetitle) { global $pagelog; // ※2 $savedata = $pageid . "<>" . htmlspecialchars($pagetitle) . "\n"; // ファイル生成&書き込み if ( ($handle = fopen( $pagelog, 'a')) == FALSE) { return false; } fwrite( $handle, $savedata); fclose( $handle ); return true; } ?>
// ※1 作成したページをページ一覧に保存
「pageid<>pagetitle」
の形式で、作成したページの一覧をファイルに保存していきます。
なおpageidとpagetitleの区切りに<>を使っているのでpagetitleはタグを除去しています。
global $pagelog; // ※2
global 変数名
で変数の有効範囲を広げる(グローバル変数として扱う)ことができます。
今回のサンプルスクリプトでは、関数recordPages()の外側にある$pagelogを扱うことができるようになっているのがお分かりいただけるでしょう。
ここでは変数のスコープという概念が重要な働きをしています。
上の説明※2では、グローバル変数とか変数のスコープという言葉が出てきましたので簡単に説明しておきます。
変数のスコープとは、いわば変数の有効範囲のことです。
まずはサンプルスクリプトをご覧ください。
<?php $g = "こんにちは"; // (a) echo $g; // 「こんにちは」と表示される(1) hi(); // 「さようなら」と表示される(2) echo $g; // 「こんにちは」と表示される(3) function hi() { $g = "さようなら"; // (b) echo $g; } ?>
これを見ると、関数 hi() の内部で$gを定義しなおしていますから、(3)でも「さようなら」と表示されそうなものです。しかし実際には(3)では「こんにちは」と表示されます。まるで、最初に(a)で定義した$gと、関数 hi() の内部(b)で定義した$gは違う変数のように扱われているのです。
このような変数の有効範囲のことを、変数のスコープと言ったりします。PHPの場合は関数の内側と外側では別々の変数として扱われることを理解しておけば十分でしょう。
変数のスコープを導入することで、たくさん変数が出てきて上書きをする心配が無くなったり、プログラムの再利用の際にも変数名がかぶることが無くなったり、とさまざまなメリットがあります。
また、この概念がオブジェクト指向にも発展していきます。