Category Archives: 基本

身も蓋もなく言うとPHPでXMLを受け取るとはつまり

タイトルはホッテントリメーカーを使ってみましたw
面白いですね。これ。

というわけで、PHPでXMLを受け取る方法ですが
とあるサービスでこちらのPHPサーバファイルを叩いて貰って
XMLを取得する、ということをしたかったんですが
POSTデータを見ても何も入ってないΣ(゚д゚lll)ガーン

ん?ん?取得方法を間違えたかな?何か特殊な受け取り方があるのかな?と思っていたら
なんと標準入力で受け取るんですね。。


$xml = file_get_contents('php://input');

PHP長いこと使ってましたが、初めてXMLをリクエストとして受け取ったので
全然知らなかったです。。

PHPでクロージャ

というわけでPythonをちょこちょこ使ってたので(主にGoogle Application Engineのため)、
クロージャを使うのが当たり前になりました。
でも、Pythonは言語仕様的にクロージャが使いやすくなっており、
PHPで言うなら

hoge.php
$x = 0;
function get($y) {
    $x += $y;
    return $y;
}

----

require('hoge.php');
hoge.get(2);

こんな感じで簡単にクロージャが実装できるんですよね。

まあ、それは無理なので。。クロージャを使ったことが無い人に、クロージャのサンプルを上げるとすると、

function counter () {
    $v = 0;
    return function () use(&$v) {
        return $v++;
    };
}

$c1 = counter();
$c2 = counter();

echo($c1() . "\n");
echo($c1() . "\n");
echo($c2() . "\n");
echo($c1() . "\n");
echo($c2() . "\n");
echo($c1() . "\n");

wikiにも載ってるこんな感じのプログラムでしょうか。counterの返り値に無名関数を返して、$vをlexicalに使おうという感じのプログラムです。phpはuse()で使用するlexical変数を指定しなくてはいけないんですねー。変更も加えるので参照付き呼び出しです。
結果は、

0
1
0
2
1
3

こうなります。
便利ですか? まあクラスでやっても同じですねw

class Counter
{
    private $v = 0;
    public function inc()
    {
        return $this->v++;
    }
}

$c1 = new Counter();
$c2 = new Counter();

echo ($c1->inc() . "\n");
echo ($c1->inc() . "\n");
echo ($c2->inc() . "\n");
echo ($c1->inc() . "\n");
echo ($c2->inc() . "\n");
echo ($c1->inc() . "\n");

本当は名前空間を汚さないように、Javascriptのように

(function () {
    function () {
        // hogehoge
    }
})()

こう使いたいんですけど、最後の()で関数実行が出来ないんですよね。
PHPの無名関数は返り値に使うか変数に入れるかしないといけないみたいです。。
残念。

phpプログラム中でエラー表示する設定に変更。

また来ました。エラーが表示されない!たぶんphp.iniで表示しない設定にされてるんだろうけど、script本体で表示:非表示をon:offしたほうがスマートだよね。でも方法忘れた!(笑

そんな状況、何度もあって、そんな時はこのブログを検索することにしてるのですが、それでも検索しにくいなーと感じたのでもう1回投稿です。

とりあえず、phpinfo()で本当に

  • display_errorsがOFF

かチェックを。error_reportingはphpinfo()から見てもよく分からないので(笑)ついでに設定を。

error_reporting( E_ALL );
ini_set('display_errors', 'On');

phpinfo();でチェックして、display_errorsがonになってることをご確認ください。
さーこれで忘れてもすぐに検索できるぞ!私m9(・∀・)ビシッ!!

起動前に処理するファイルを挟む。

これは知らなかった。

PHPにはメインファイルの前に、自動的に付加するファイル名を指定する、auto_prepend_fileという設定があります。これを使えば、プロジェクト内のファイルには一切手を加えなくても、PHPで前処理を行うことができます。※なお、プログラムの後処理を加えたい場合は、auto_append_file という設定もあります。

引用元: PHPの開発時になかなか使えるauto_prepend_file設定 : アシアルブログ.

終了時の処理もあるとは。。何かに使えそう。何?と言われてもすぐ出てきませんが。

ワイルドカードでマッチさせる : fnmatch

“*.php-seed.net”みたいな*をワイルドカードとしてマッチさせようと正規表現で頑張っていましたが、結構しんどい(^_^;
もしやと思って検索してみたら、そのものズバリの関数があるんですね。さすがPHP!

fnmatch()はstring で指定された文字列が pattern で指定されたシェルワイルドカードにマッチするかどうかチェックします。

引用元: PHP: fnmatch – Manual.

正規表現でやろうとするとやたら複雑になったので、これで手を打っておきます。

PHPのリロード対策

あきら×ひろこ=ゆう PHPのリロード対策を誤っていました!

PHPでこれを表示させないためには、パラメータをセッション変数に保存し、Location ヘッダーに自分自身を指定して送信するのが一般的だ。

少し前は、以下の様に実装していた。

if isset $_POST[ 'command' ] {
パラメータの処理

header ‘Location: ‘ . $_SERVER[ 'PHP_SELF' ] ;
exit ;
}

しかし、これだと以下のようなフォームでページが呼び出された場合にうまく行かない。

上記実装では command パラメータが与えられる事を前提としているのに、パラメータは何も渡って来ない。

正しい実装は以下の様にするべきだ。

if $_SERVER[ 'REQUEST_METHOD' ] == ‘POST’ {
パラメータの処理

header ‘Location: ‘ . $_SERVER[ 'PHP_SELF' ] ;
exit ;
}

なるほど確かにそうしがち忘れがちのメモ。

splitとexplodeの違い

split

使っちゃだめよ? – がるの健忘録
さて。まずマニュアルをちゃんと読んで見ませう。

http://jp.php.net/manual/ja/function.split.php

split ― 正規表現により文字列を分割し、配列に格納する

正規表現により文字列を分割し

正規表現により

正規表現

大切なところをちょっと繰り返してみました。

あっらー
splitなんてexplodeのエイリアスでしょ、ぐらいに思ってました。
いかんですね。
これからは特に正規表現を必要としていない場合はexplodeですね。

SimpleXMLElement オブジェクトは serializeできない

SimpleXMLElement オブジェクトは serializeできない – phaのPHPとか自習室 – はてな自習室

なーんか、Zend_Cache_Classがうまく動かないなーと思ってたら、原因は別のところに。

SimpleXMLElement オブジェクトは serializeできないらしい。

OMG!
なんでそんな仕様に・・?

PHPのSort関数がおかしい件

PHPのsort関数は相当おかしい – hnwの日記

phpの罠の1つ、sort関数ですが、

$a=array("1e1", "1f1", "9");
sort($a);
var_dump($a);

$a=array("9", "1e1", "1f1");
sort($a);
var_dump($a);

を実行すると、

array(3) {

[0]=>

string(3) “1e1″

[1]=>

string(3) “1f1″

[2]=>

string(1) “9″

}

array(3) {

[0]=>

string(1) “9″

[1]=>

string(3) “1e1″

[2]=>

string(3) “1f1″

}

となるという。。。うーむ(^_^;)
ようは第二引数のFLAGをちゃんと立てようという話ですが、今までのProgに埋没してそう!

でも、調べたらちゃんと指定されてた!えらい!

コールバック関数でクラスメソッドを使う

PHP: 本ドキュメントにおける疑似的な型および変数 – Manual

配列で渡しますよ、と。

$obj = new MyClass();
call_user_func(array($obj, ‘myCallbackMethod’));

やりたかったのは静的クラスメソッドを渡す方法なのです。

call_user_func(array(‘MyClass’, ‘myCallbackMethod’));

クラス名を文字列として渡せばよいのですね。
ちなみに、同じクラスから呼び出すなら

call_user_func(array(‘self’, ‘myCallbackMethod’));

でも大丈夫です。
マニュアルの投稿を見ると、

$callback array(‘parent’, ‘method’);

こんなのもいけるみたいです。ふむふむ。