Home > タグ > PHP

PHP

PHPユーザー定義関数

PHPで関数を宣言するときにfunctionで宣言するのですがメソッド系が苦手なのでどうもつかみにくい。
Javaの記事でも書いたんですけど、引数の考えがあまり理解できてないのかもしれない。Cのころから。
[過去エントリ]:Javaのメソッドが難しい

簡単に言うとすでに用意されている関数はいいのですが、用意されていない場合自分で宣言するんです。
1回などではあまりありがたみがわからないですがこの処理を何回も行うというときは宣言したほうがいいです。

<?php
    for($x = 1; $x <10; $x++){
        for($y = 1; $y <10; $y++){
            calc($x, $y);
        }
    }
    function calc($su1, $su2){
        $gokei = $su1 * $su2;
        print $su1."*".$su2."=".$gokei."<br>\n";
    }
?>

簡単に九九の計算を表示させているだけですが計算と表示をcalc関数にて行っています。
ちなみに結果はこんな感じにでます。とても長いので途中で略しますけども。
1*1=1
1*2=2
1*3=3
1*4=4
1*5=5
1*6=6
1*7=7
1*8=8
1*9=9

ユーザー定義関数

function 関数名(引数1,引数2){ 処理; };

関数の呼び方

関数名(引数1,引数2);

渡す値を設定しないならば引数は必要ありませんが、処理をひとまとめにして見やすくするときなどに。

PHP関数 sprintf

前回しょぼいカウンタを作ったので、それに少しずつ機能を追加していきたいと思います。
それに関してsprintf関数を使って桁数表示し空白を0で埋めるということをやってみます。

sprintf:フォーマットされた文字列を返す場合に使用する関数
sprintf("format",$count);

第一引数:フォーマット型宣言

%
パーセント文字。引数は不要
b
引数を整数として扱い、バイナリ表現
d
引数を整数として扱い、10 進数表現
u
引数を整数として扱い、符号無しの10進数表現
f
引数をdouble として扱い、浮動小数点数表現
o
引数を整数として扱い、8 進数表現
s
引数を文字列として扱い表現
x
引数を整数として扱い、16進数として小文字で表現
X
引数を整数として扱い、16進数として大文字で表現

sprintfです。sprintと書いてて何が違うのか分からなくなったのは内緒。
printfなのですが文字列を返すだけなので表示はprintかechoで行う必要があります。

ソースコード

<?php

$count_file = 'count.txt';

$count_lenght = 5;

$fp = fopen($count_file, 'r+');

if($fp) {
    if (flock($fp, LOCK_EX)) {
        $counter = fgets($fp, $count_lenght);
        $counter++;

        rewind($fp);

        fwrite($fp, $counter);
       
        flock($fp, LOCK_UN);
    }
}

fclose($fp);

$format = '%0'.$count_lenght.'d';

$count = sprintf($format, $counter);
print $count;

?>

$format = '%0'.$count_lenght.'d';

桁数を変数に入れてるので$format変数にフォーマットの文字列としていれておきます。
10進数、空白を0で埋めるとするので、たとえば5桁だと%05dとなるので文字列としていれておきます。

$count = sprintf($format, $counter);

sprintfで先ほどの$format(%05d)を使い、$counterの値をその形式で$countに返しています。

そして最後にprintして終了。ファイルロックのところをifでやるようにしましたがこっちのがいいかな。

phpで掲示板 part2

長らく時間が空きましたが前回の続きです。サンプル通りなはずなのですが初歩ミスでエラーでまくり。
[過去エントリ]:phpで掲示板 part1

参考サイト
MetalMickey

最低機能の掲示板を作るをすべてこなし一応動作する形になりました。次は流れに沿って機能追加です。

動作サンプル画面
bbs

やはり気になったのは初歩的なエラーです。parse errorで注意してくれるのですがその意味を把握しないときついです。

Parse error: syntax error, unexpected

一番多いのはこのぶん。syntax errorということで文法エラーです。
この文章の後に具体的な間違いと間違っている行数が表示されます。

パーサトークンの一覧

このページにあるトークン名でエラーが吐き出されてきます。

一番多かったのは変数に$をつけ忘れる。;を忘れる。.を記述しない。など。だめだ初歩的すぎる。

PHPでアクセスカウンタ

前回勉強したfopen,flock,fgetsはなにかというとアクセスカウンタを作成するための勉強でした。
[過去エントリ]:PHP関数 fopen,flock,fgets

プログラムの流れ

  1. ファイルオープン
  2. ファイルから数値を取得して変数に代入
  3. 変数に格納している値を増加し、ファイルに書き込む

リロード防止や昨日今日だったりの機能は今後できればつけてみたいかなと思いますがまずはシンプルなのを。

ソースコード

<?php

//ファイル設定
$count_file = 'count.txt';

//カウンタの桁数
$count_lenght = 5;

//ファイルを開く
$fp = fopen($count_file, 'r+');

//値を変数に格納
$counter = fgets($fp, $count_lenght);

//値を増加
$counter++;

//ファイルポインタを先頭へ移動
rewind($fp);

//ファイルロック
flock($fp, LOCK_EX);

//ファイルに書き込む
fwrite($fp, $counter);

//ファイルロック解除
flock($fp, LOCK_UN);

//ファイルを閉じる
fclose($fp);

//カウンタ表示
print $counter;
?>

たぶんこんなん。一応動いたけど、ソースの完成度がいまいちなきがする。もっと改良してみますか。

PHP関数 fopen,flock,fgets

PHP関数の勉強。空き時間があったのでちょこちょこ勉強してみました。今日はファイル関係。
なぜこの3つの関数なのかというとちょっとした意図がありますがそれはまた今度にでもします。

fopen

ファイルをオープンするために使われる関数。第一引数で開く対象、第二引数でオープンモードを指定します。
ファイル名を直接いれるのも可能ですが、利用しやすくするために変数に入れておくといいみたいです。
ファイルポインタ($fp)を利用して以後の処理を行うので最初に格納しておきます。というか戻り値。
C言語の時もファイルポインタはわかりやすいようにしとけと言われたので$fpでいいと思います。

文法

$fp = fopen('filename','mode');

オープンモード

モード
説明
r
読み込みモードで開く。ファイルポインタはファイルの先頭
ファイルがないと書き込み不可。readonly,編集などはできません。
r+
読み書きモードで開く。ファイルポインタはファイルの先頭
ファイルがないと書き込み不可。読み書きモードです。r+はファイルに対して上書き保存を行います。
w
書き込みモードで開く。ファイルポインタはファイルの先頭
ファイルがない場合作成。書き込みモードです。ファイルがなくても実行できる以外はr+と同じで上書き保存を行います。
w+
読み書きモードで開く。ファイルポインタはファイルの先頭
ファイルがない場合作成。読み書きモードです。wよりも扱いやすいので通常はこちらを使用?
a
書き込みモードで開く。ファイルポインタはファイルの終端
ファイルがない場合作成。書き込みモードです。wと大きく違うのは既存のファイル内容に追加するということです。
a+
読み書きモードで開く。ファイルポインタはファイルの終端
ファイルがない場合作成。読み書きモードです。aの読み書き版。あまり例がなかった。
x
書き込みモードで開く。ファイルポインタはファイルの先頭
ファイルがあるとエラー。ファイル作成を行うモード。ローカルファイルのみ有効。※PHP4.3.2以降でサポート
x+
読み書きモードで開く。ファイルポインタはファイルの先頭
ファイルがあるとエラー。ファイル作成を行うモード。ローカルファイルのみ有効。※PHP4.3.2以降でサポート

flock

ファイルのロックをします。PHPはファイルを利用することもたくさんありますがよくロックする意味がわかりませんでした。
簡単にいうと、同時には行えないから順番にやります。という感じだと思います。(自分はこう解釈)
また、ファイルに同時にアクセスを行うとファイルの破壊を招く場合があります。wikiで更新が重なったみたいな。

そういうときにflock関数を使って同時アクセスをロックして順番に処理を行うということをするようです。
第一引数でファイルポインタ($fp)、第二引数でロックモードを指定します。

文法

flock($fp,lockmode);

ロックモード

モード
説明
LOCK_SH
書き込みを禁止
LOCK_EX
読み書きを禁止
LOCK_UN
ロックを解除。※fcloseでflockは解除されるのであまり書かれることはない
LOCK_NB
flock中にロックさせない。flockしてるけどこれは例外といった指定用かね。

fgets

ファイルから1行のみ取得してくる関数です。1行以上読みたい場合は他の関数を使います。
1行のみですので改行があると読み込みは終了。EOFが来た場合も終了します。

第一引数にてファイルポインタ($fp)、第二引数にて読み込むバイト数-1を設定できます。
第二引数にたとえば8を設定した場合-1で7バイトまで読み込む設定になります。

文法

fgets($fp,length);

関数の理解が中途半端で絶望した!次回これを使ってなんかすると思います。たぶんバレバレ。

Home > Tags > PHP

Search
Feeds
Meta
BlogPet
PageView
  • 試しに自作カウンタ稼働
  • count: 05717

Return to page top