カテゴリー: php

  • PHP の無名関数が便利なので今すぐ使ったらいいと思うよ、WordPress ならフックとかでね(PHP 5.3.0以降

    PHP の無名関数が便利なので今すぐ使ったらいいと思うよ、WordPress ならフックとかでね(PHP 5.3.0以降

    PHP の世代交代が進んでますね!

    いい加減 PHP 5.2 に対応しなくてもいい流れになって欲しいものですが、レンタルサーバーによっては未だ 5.2 のところもあるとかないとか。

    5.2 はすっぱり諦めて、無名関数を使いましょう。

     

    無名関数とは

    参考&引用: PHP: 無名関数 – Manual

    無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。
    コールバック パラメータとして使う際に便利ですが、用途はそれにとどまりません。

    他の言語なら当たり前のように使えていたのがようやく。

    関数の名前をいちいち付けずに実行できる、ってやつです。

    PHP 5.3 以上で対応。

     

    無名関数、どういうときに使うか

    PHP マニュアルの説明通り、コールバックで使うことが多いです。

    その他にも変数に代入できたり。

    // $wp に無名関数を代入
    $wp = function ( $ver ) {
    	printf( 'WordPress %s', $ver );
    };
    // 代入した関数が実行される。
    $wp( '3.9' );
    
    // 実行結果 → WordPress 3.9

     

    無名関数 x WordPress

    そんな無名関数、もちろん WordPress でも活躍します。

    ぼくが WordPress 開発時に無名関数使うのは主としてアクションフック。

    add_filter や add_action ですね。

    ちょっとやってみましょう。

     

    すごく簡単な WordPress のフック例

    the_title で出力される関数を ★ で囲むだけのフックを作成。

    よく見る形のフックですね。

    /**
     * the_title 出力を★で囲むだけのフック
     *
     * @param $title
     *
     * @return string
     */
    function add_text_the_title( $title ) {
    	return '★' . $title . '★';
    }
    add_filter( 'the_title', 'add_text_the_title' );

    これを無名関数で置き換えてやります。

     

    無名関数を使った WordPress のフック例

    関数名はいらないので取り除いてやり、add_filter 2つ目の引数に無名関数を移動。

    /**
     * the_title 出力を★で囲むだけのフック(無名関数
     *
     * @param $title
     *
     * @return string
     */
    add_filter( 'the_title', function ( $title ) {
    	return '★' . $title . '★';
    } );
    

    簡単ですね!

     

    無名関数になぜ置き換えるのか

    コールバックや WordPress のアクションフックで使う関数は、基本的に他で使うことはありません

    無駄な関数名が増えると開発時に関数名が多すぎて混乱したり、開発環境での使いもしない関数名コードヒントが出たりしますよね。

    そういった無駄がなくなります。

    使わない理由がありませんね!

     

    ホホまとめ

    そろそろ PHP 5.2 対応は切り捨てていこうと思っているので、そんなタイミングで書いてみました。

    さして新しくもない知識ですけれども、誰かのために少しでもなれば。

  • xampp で phpDocumentor を使えるようにする

    xampp で phpDocumentor を使えるようにする

    php のライブラリやアプリケーション・CMS などの API を理解するためにソースを追いかけるっというのは無駄なのでドキュメントを生成して、ドキュメントから読み解くのが正着。

    php では phpDocumentor が主に使われています。

    Zend Framework や Google app engine、WordPress など。

    インストール手順・使い方をよく忘れるのでメモ(以下 Windows + xampp 環境

     

    php に環境変数を通しておく

    環境変数PATHに xamppインストールフォルダ/php を通しておくと便利なので通しておく。

     

    pear コマンドの確認

    pear が使えるか確認、pear バージョンが出れば使える。

    pear version

     

    インストールの前に、xampp に古い phpDocumentor 1.4.4 が入っていたので削除。

    pear uninstall phpDocumentor

     

    ついでに pear の更新。

    pear upgrade-all

     

    phpDocumentor のインストール

    phpDocumentor 公式サイトの手順に従って進める。 インストールは pear のコマンドから。

    pear channel-discover pear.phpdoc.org
    pear install phpdoc/phpDocumentor
    phpDocumentor インストール
    phpDocumentor インストール

     

    phpDocumentor のインストール完了。

    phpdoc 起動のための環境変数を設定。

    PHPBIN と PHP_PEAR_BIN_DIR を通す。

    PHPBIN_PHP_PEAR_BIN_DIR
    環境変数を設定

     

    もしくは、xamppインストールフォルダ/php の phpDocumentor 起動バッチを修正。

    最終行をコピーして書き変え・コメントアウト

    @echo off
    if "%PHPBIN%" == "" set PHPBIN=php.exe
    if not exist "%PHPBIN%" if "%PHP_PEAR_PHP_BIN%" neq "" goto USE_PEAR_PATH
    GOTO RUN
    :USE_PEAR_PATH
    set PHPBIN=%PHP_PEAR_PHP_BIN%
    :RUN
    rem "%PHPBIN%" "%PHP_PEAR_BIN_DIR%\phpdoc.php" %* ここをコピーして rem でコメントアウト
    "%PHPBIN%" "xamppディレクトリのパス\php\phpdoc.php" %*

     

    ここまでやれば phpdoc コマンドが使えます。

     

    phpDocumentor でドキュメントを出力する

    コマンドの使い方は phpdoc -h でヘルプが見られる。

    phpdoc -h
    phpdoc -h

     

    基本的には、

    phpdoc -d {ドキュメントを作りたいパス} -t [出力先]

    でオッケー。

    –title “タイトル” とか使うと、ドキュメントのタイトルの指定ができたりする。

     

     

    phpdoc コマンドでドキュメントを作るも、

    「Unable to find the ‘dot’ command of the GraphViz package. Is GraphViz correctly installed and present in your path?」つまり、GraphViz が入ってないし PATH が通ってないよ!

    と怒られるのでドキュメントのチャート生成に必要な graphviz を入れる。

    Windoes 用をインストールして、GraphViz インストールディレクトリの bin フォルダに環境変数PATH を通す。

    これでようやく問題なく出力できるように。

    WordPress のプラグイン、Jetpack の API Document 生成を試す。

    Jetpack WordPress Plugin  API ドキュメント
    Jetpack WordPress Plugin API ドキュメント

     

    できた。

     

    ホホまとめ

    完全に自分のためのメモ。

    よく忘れることは書いておくとあとあと自分で思い出せるのでよし。

    ついでに作成した Jetpack のドキュメントをサーバーにアップしておいたんで、必要な人は見るといいかも。

  • strip_tags、html タグを取り除く PHP の関数

    strip_tags、html タグを取り除く PHP の関数

    当たり前のことでも書いていくといいことがあるはずなので備忘録。

    php で html タグや php タグを削除する便利な関数。

     

    strip_tags

    公式のマニュアルはこちら、簡単な関数。

     

    string strip_tags ( string $str [, string $allowable_tags ] )

    パラメータは2つ、1つめは必須で、2つめは許可するタグを指定できるオプションの引数。

     

    使ってみる

    実際に使って確認。

    まずは file_get_contents で http://example.com を表示するだけのサンプル。

    <?php
    $html = file_get_contents( 'http://example.com/' );
    echo $html;
    ?>

     

    http://example.com のソースはこんな。

    <!doctype html>
    <html>
    <head>
        <title>Example Domain</title>
    
        <meta charset="utf-8" />
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <style type="text/css">
        body {
            background-color: #f0f0f2;
            margin: 0;
            padding: 0;
            font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
    
        }
        div {
            width: 600px;
            margin: 5em auto;
            padding: 50px;
            background-color: #fff;
            border-radius: 1em;
        }
        a:link, a:visited {
            color: #38488f;
            text-decoration: none;
        }
        @media (max-width: 700px) {
            body {
                background-color: #fff;
            }
            div {
                width: auto;
                margin: 0 auto;
                border-radius: 0;
                padding: 1em;
            }
        }
        </style>    
    </head>
    
    <body>
    <div>
        <h1>Example Domain</h1>
        <p>This domain is established to be used for illustrative examples in documents. You may use this
        domain in examples without prior coordination or asking for permission.</p>
        <p><a href="http://www.iana.org/domains/example">More information...</a></p>
    </div>
    </body>
    </html>

     

    これを実行すると、http://example.com のソースを引っ張ってくるのでそのまま表示される。

    example.com が表示される
    example.com と同じのがそのまま表示される

     

    strip_tags してみる

    まずは1つめの引数だけ使って。

    <?php
    $html = file_get_contents( 'http://example.com/' );
    echo strip_tags( $html );
    ?>

     

    これで全てのタグが除去されて、こうなる。

    strip_tags によりタグというタグが取り除かれる
    strip_tags によりタグというタグが取り除かれる

     

    インラインスタイルの <style></style> 内は残る。

     

    2つめの引数で除外してみる

    <style> タグを指定。

    <?php
    $html = file_get_contents( 'http://example.com/' );
    echo strip_tags( $html, '<style>' );
    ?>

     

    ちゃんと <style> だけ残った。

    除外できた。複数指定も可。
    除外できた。複数指定も可。

     

    注意点

    ドキュメントに書いてあるとおり、

    strip_tags() は HTML の検証を行わないため、 不完全または壊れたタグにより予想以上に多くのテキスト/データが削除される可能性があります。

    乱れた HTML だと実行結果が芳しくないかもしれないので注意。

    おわり。

  • phpの実行結果をhtmlファイルへ書き出したかったので file_put_contents を使いました。

    phpの実行結果をhtmlファイルへ書き出したかったので file_put_contents を使いました。

    備忘録的なやつなのでしゅっと書きます。

     

    phpで部品を作ってその部品一つ分のphp出力結果をhtmlファイルに書き出したい事案がありまして。

    ささっとやりました。

    まずは使った関数から。

     

    file_put_contents

    文字列をファイルに書き込む関数です。

    引数は4つあります。今回使ったのは簡単なものなのでうち2つ。

     

    ob_get_contents

    出力のためのバッファ内容を取得する関数です。

    バッファの内容は消去されないパターンのやつです。

     

    ということで使ってみた。

    簡単なソースで追ってみます。

    <?php
    /**
     * phpの実行結果をhtmlファイルへ書き出す簡単なサンプル
     */
    
    // 出力のバッファリングを有効にする
    ob_start();
    ?>
    <!-- ここから -->
    
    えいちてぃーえむえる
    へっど
    ぼでぃ
    
    <?php echo '途中でphpももちろん使えます。'; ?>
    
    <!-- ここがバッファされます -->
    <?php
    // 同階層の test.html にphp実行結果を出力
    file_put_contents( 'test.html', ob_get_contents() );
    
    // 出力用バッファをクリア(消去)し、出力のバッファリングをオフにする
    ob_end_clean();
    ?>

    はい、こんな感じです。

    サンプルソースコード内にコメントを入れているので、すぐに追えるかと思います(たぶん

    phpを実行すると、test.html が生成されます。生成されるのはこちら↓

    生成されましたー
    生成されましたー

     

    簡単ですね、htmlを吐き出す系のWebサービスが作れそうな香りがしますよ。

     

    ホホまとめ

    「わからない→調べる→やってみる→悩む→できた→記事にする」

    という己を成長させるローテーションがここに!

    自分のブログは自分が一番見るので、いろいろ残していきたいです。

  • ZendOptimizerPlusをxmappに入れる。php5.5以降はAPCから置き換わるそうな。

    ZendOptimizerPlusをxmappに入れる。php5.5以降はAPCから置き換わるそうな。

    先日php関連のニュースをどっかで見まして、php5.5からはphpデフォルトのコードキャッシュがAPCからZendOptimizer+に置き換わる、っということで。

    ちょっとphp本家の当該ページを覗いてみました。

     

    …ふむふむ。どうやらAPCよりZendOptimizer+のほうが速いらしいです。

    ベンチマーク表もありました。

    速いということなので早速ローカルのxamppに導入しようかと。

    あとはまぁ新しいもの好きなので、血が騒ぐというかなんというか。

    ※手順はwindows7 x64 + xampp x86環境になります。

    ZendOptimizer+をxamppへ導入するための要件

    • phpがローカルで入ってること
    • phpinfoでphpバージョンの確認をしておくこと  (設定変えてなければこのリンクで見られます)
    • なんらかのテキストエディタ
    • めげない気持ち

    こんなところですかね。APCと共存はできないということです。

    ZendOptimizer+をインストールする

    ZendOptimizer+の入手

    windowsだとコンパイルめんどうかつめんどうなので、コンパイル済みのライブラリを使わせてもらいましょう。

    http://windows.php.net/のダウンロードディレクトリから確認したphpバージョンに該当するものを選択。

    ts と nts って2種類あるよね
    ts と nts って2種類あるよね
    • ts: Thread Safe、スレッドセーフ版です。安定。
    • nts: Non Thread Safe、ノンスレッドセーフ版。安定ではない。

    のでぼくはts版を選択。

    ZendOptimizer+をphpに導入

    ダウンロードしたzip内の php_ZendOptimizerPlus.dll を使います。

    xamppが入ってるディレクトリを確認して xampp\php\ext\ の中に dll をコピーしましょう (普通のひとは c\直下だと思います)。

    スクショ用のエクスプローラです
    スクショ用のエクスプローラです

    ZendOptimizer+を使うようにphp.ini設定する

    xampp\php\php.ini をなんらかのテキストエディタで開く。

    notepad++派
    notepad++派

    APCが有効になっているとダメなので apc.enabled を検索してみる。

    # もしAPC関係が有効であれば先頭にセミコロン ; をつけてコメントアウトすること
    
    ; APC ;
    ;extension=php_apc.dll
    [APC]
    ;apc.enabled = 1
    ;apc.shm_segments = 1
    ;apc.shm_size = 64
    ;apc.max_file_size = 10M
    ;apc.stat=1
    
    # ↓これを追加すればおk。相対パスは使えないっぽいので環境に合わせてパスは要変更
    
    [Zend]
    ; ZendOptimizerPlus ;
    zend_extension = "E:\xampp\php\ext\php_ZendOptimizerPlus.dll"
    zend_optimizer.optimization_level=15

    ZendOptimizer+が有効になったか確認する

    1. 設定ファイルを書き変えたら保存して、ローカルサーバー (apacheでしょうか) を再起動

    2. ローカルのphpinfo (設定変えてなければこのリンクで見られます) を確認。

    3. with Zend Optimizer+ v7.0.1-dev~ って行が増えてればOK。(ページ内検索で Zend Scripting を検索かければいいと思うよ。)

    有効化。めでたしめでたし。
    有効化。めでたしめでたし。

    ホホまとめ

    新しいものってなんでこう楽しいんでしょうか。

    入れるだけで「やったった!!」っていう気持ちになれる不思議。

    え、速度的にどうかって?そんなことはどうでもいいんですよ速くなった気がします。