PHP (ピー・エイチ・ピー) であそぼう 1
〜 PHP で Matrix のアレ 〜
2024-11-22 作成 福島
TOP > asob > php-anime
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob | Shell ]

PHP も悪くない

TIOBE Software が調査している人気プログラミング言語の発表によると、
順位は 10 位以下になったものの (それでもインタプリタとしては 3 位)、以下の理由により、
初心者向けのプログラミング言語としては悪くありません。
  1. インタプリタである
  2. 型宣言が不要 (欠点でもある)
  3. 偏屈な裏技を使わなくても実現できる機能がある
PHP というと「HTML に埋め込んで、Web ページを動的に作るもの」*1という印象が強いけれど、単体でも動作します。
最初から Web ページに組み込んでしまうと、以下の多すぎる困難な理由により学習のハードルが高くなってしまいます。
⇓ これはもう、見るだけで気が遠くなることでしょう。
1. Web ページが表示される構造を理解する必要がある。(通信の知識)
2. サーバのアカウントを用意する必要がある。(契約の知識)
3. HTML を理解する必要がある。(表現方法の知識)
4. ブラウザの操作を理解する必要がある。(機能と使い方の知識)
5. ファイル転送を理解する必要がある。(通信とディレクトリ構造の知識)
6. ファイル転送ソフトの使い方を覚える必要がある。(機能と使い方の知識)
7. サーバ側 PHP の設定を理解する必要がある。(Web サーバの設定の知識)
PHP をプログラミング言語として学習したいだけなら、これらはすべて無用な邪魔者となります。
一度に学習するのは困難なうえに、問題が起きた時の切り分けも難しくなります。(← 根性論が大好きな日本人は、これが非常にヘタクソ)

PHP はその生い立ちから、この悪い学習方法に従わざるを得ない時期が過去にありました。
Web ページの制作に携わっていた人たちは既に上記 1 ~ 6 の知識を有していて PHP の学習がしやすい背景があり、
その頃の PHP は今ほど複雑ではありませんでした。
(7 は用意された手本に従えばとりあえず動いたので、大きな問題にならなかった)
*1 Personal Home Page Tools (ホームページを作る道具) として開発されていたので、この印象は間違っていません。



本稿では、邪魔者を気にせず学習のハードルを下げるため、手元で PHP を単体実行します。

当「プログラミングであそぼう」では、リアルタイムキー入力が不要な課題もあります。
その中のひとつ「Matrix のアレ」を PHP で作成しました。

Windows 版の PHP はこちらを参考にして、予めインストールしておいてください。


1. スクリプト作成

コードは長いけど、ほとんどが表示用データ。動作に関係するのは一番下の 15 行程度。
使い慣れているテキストエディタで打ち込んでください。(Windows なら「メモ帳」でも可)
' ' は空白文字 (スペースキーで入力) です。TAB 文字とは異なるので注意してください。


ファイル名: animation.php
#!/usr/bin/php
<?php
$page = [
    [   // 1
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    ],
    [   // 2
    "              z  ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    ],
    [   // 3
    "    Z         i  ",
    "              z  ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    ],
    [   // 4
    "G  _[   mS  ( = 3",
    "    Z         i  ",
    "              z  ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    ],
    [   // 5
    ":  pGy  YQ  y ] H",
    "G  _[   mS  ( = 3",
    "    Z         i  ",
    "              z  ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    ],
    [   // 6
    "B VgU8S(E* V/ eu@",
    ":  pGy  YQ  y ] H",
    "G  _[   mS  ( = 3",
    "    Z         i  ",
    "              z  ",
    "                 ",
    "                 ",
    "                 ",
    "                 ",
    ],
    [   // 7
    "b 2E;XsLT9 xP M!w",
    "B VgU8S(E* V/ eu@",
    ":  pGy  YQ  y ] H",
    "G  _[   mS  ( = 3",
    "    Z         i  ",
    "              z  ",
    "                 ",
    "                 ",
    "                 ",
    ],
    [   // 8
    "PFRpx(Y_%| 742Oy=",
    "b 2E;XsLT9 xP M!w",
    "B VgU8S(E* V/ eu@",
    ":  pGy  YQ  y ] H",
    "G  _[   mS  ( = 3",
    "    Z         i  ",
    "              z  ",
    "                 ",
    "                 ",
    ],
    [   // 9
    "WrBj*B_Q5;+87u5:p",
    "PFRpx(Y_%| 742Oy=",
    "b 2E;XsLT9 xP M!w",
    "B VgU8S(E* V/ eu@",
    ":  pGy  YQ  y ] H",
    "G  _[   mS  ( = 3",
    "    Z         i  ",
    "              z  ",
    "                 ",
    ],
    [   // 10
    "n_k(z0q@uxV:tY|7p",
    "WrBj*B_Q5;+87u5:p",
    "PFRpx(Y_%| 742Oy=",
    "b 2E;XsLT9 xP M!w",
    "B VgU8S(E* V/ eu@",
    ":  pGy  YQ  y ] H",
    "G  _[   mS  ( = 3",
    "    Z         i  ",
    "              z  ",
    ],
    [   // 11
    "=DbX=U5sUK1dO6I'P",
    "n_k(z0q@uxV:tY|7p",
    "WrBj*B_Q5;+87u5:p",
    "PFRpx(Y_%| 742Oy=",
    "b 2E;XsLT9 xP M!w",
    "B VgU8S(E* V/ eu@",
    ":  pGy  YQ  y ] H",
    "G  _[   mS  ( = 3",
    "    Z         i  ",
    ],
    [   // 12
    "!F;p6vbv<XTRiOKNi",
    "=DbX=U5sUK1dO6I'P",
    "n_k(z0q@uxV:tY|7p",
    "WrBj*B_Q5;+87u5:p",
    "PFRpx(Y_%| 742Oy=",
    "b 2E;XsLT9 xP M!w",
    "B VgU8S(E* V/ eu@",
    ":  pGy  YQ  y ] H",
    "G  _[   mS  ( = 3",
    ],
    [   // 13
    "Hsa3_51Iqq]w<)+8[",
    "!F;p6vbv<XTRiOKNi",
    "=DbX=U5sUK1dO6I'P",
    "n_k(z0q@uxV:tY|7p",
    "WrBj*B_Q5;+87u5:p",
    "PFRpx(Y_%| 742Oy=",
    "b 2E;XsLT9 xP M!w",
    "B VgU8S(E* V/ eu@",
    ":  pGy  YQ  y ] H",
    ],
    [   // 14
    "ab:D3myzTJ|EDZx*Z",
    "Hsa3_51Iqq]w<)+8[",
    "!F;p6vbv<XTRiOKNi",
    "=DbX=U5sUK1dO6I'P",
    "n_k(z0q@uxV:tY|7p",
    "WrBj*B_Q5;+87u5:p",
    "PFRpx(Y_%| 742Oy=",
    "b 2E;XsLT9 xP M!w",
    "B VgU8S(E* V/ eu@",
    ],
    [   // 15
    ")0k>JS\$jjvTl8j)gC",
    "ab:D3myzTJ|EDZx*Z",
    "Hsa3_51Iqq]w<)+8[",
    "!F;p6vbv<XTRiOKNi",
    "=DbX=U5sUK1dO6I'P",
    "n_k(z0q@uxV:tY|7p",
    "WrBj*B_Q5;+87u5:p",
    "PFRpx(Y_%| 742Oy=",
    "b 2E;XsLT9 xP M!w",
    ],
    [   // 16
    "F*wz0eU;1;_1FgQ*M",
    ")0k>JS\$jjvTl8j)gC",
    "ab:D3myzTJ|EDZx*Z",
    "Hsa3_51Iqq]w<)+8[",
    "!F;p6vbv<XTRiOKNi",
    "=DbX=U5sUK1dO6I'P",
    "n_k(z0q@uxV:tY|7p",
    "WrBj*B_Q5;+87u5:p",
    "PFRpx(Y_%| 742Oy=",
    ],
    [   // 17
    "vG+m/[I*od'_6C;T'",
    "F*wz0eU;1;_1FgQ*M",
    ")0k>JS\$jjvTl8j)gC",
    "ab:D3myzTJ|EDZx*Z",
    "Hsa3_51Iqq]w<)+8[",
    "!F;p6vbv<XTRiOKNi",
    "=DbX=U5sUK1dO6I'P",
    "n_k(z0q@uxV:tY|7p",
    "WrBj*B_Q5;+87u5:p",
    ],
];

$CLEAR  = "\x1B[2J\e[1;1H"; // 画面をクリアする
$GREEN  = "\x1B[32;40m";    // 文字の色を緑/黒にする
$NORMAL = "\x1B[0m";        // 文字の色を元に戻す

// すべてのページ分を繰り返す
$pages = count($page);
for ( $n = 0 ; $n < $pages ; $n ++ ) {

    // 現在ページのデータを取り出す
    $sheet = $page[$n];

    // 画面をクリアする
    print($CLEAR);

    // 現在ページを描画する
    print("-----------------\n".$GREEN);
    $cnt = count($sheet);
    for ( $i = 0 ; $i < $cnt ; $i ++ ) {
        print($sheet[$i]."\n");
    }
    print($NORMAL."-----------------\n");

    // 0.2 秒間何もしない
    usleep(0.2 * 1000**2);
}
?>


2. 実行

PowerShell を実行
スタート (右クリック) から「ターミナル」を選択。(Windows10 は「Windows PowerShell(I)」を選択)

− □ × 
 >_ Windows PowerShell ×   + |
 
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新機能と改善のために PowerShell をインストールしてください!https://aka.ms/PSWindows  

PS C:\> # PHP のバージョンを確認する
PS C:\> php -v 
PHP 8.3.13 (cli) (built: Oct 22 2024 21:07:34) (NTS Visual C++ 2019 x64)
Copyright (c) The PHP Group
Zend Engine v4.3.13, Copyright (c) Zend Technologies

PS C:\> # animation.php を実行する
PS C:\> # 実行と同時にこの画面はすぐにクリアされる
PS C:\> php .\animation.php 
-----------------
vG+m/[I*od'_6C;T' F*wz0eU;1;_1FgQ*M )0k>JS$jjvTl8j)gC ab:D3myzTJ|EDZx*Z Hsa3_51Iqq]w<)+8[ !F;p6vbv<XTRiOKNi =DbX=U5sUK1dO6I'P n_k(z0q@uxV:tY|7p WrBj*B_Q5;+87u5:p
----------------- PS C:\> exit