Home > アーカイブ > 2014-06

2014-06

「PHPコードではなくPHPコードの「書き方」を知る」を発表してきました

この記事の所要時間: 27

PHPカンファレンス関西2014で「PHPコードではなくPHPコードの「書き方」を知る」を発表してきました。

IMG_0020
写真提供:久岡写真事務所

別トラックに人気セッションがひしめく中、多くの方に聴いて頂き、ありがとうございましたm(_ _)m

発表内容

PHP 中級者(中級がどこかというのはありますが)を目指す初心者の方を対象に、FizzBuzz のコードを、関数にまとめて、クラス化するというのをライブコーディングで行いました。

また、関数にまとめた段階で、自動テストを書いて、実行結果を目で確認するのではなく、テストを実行して確認するというスタイルを取りました。

発表資料は以下です。

コードを書きながら進めていく形なので、資料だけでは少し伝わらない部分があるかもしれません。

PHPコードではなく PHPコードの「書き方」を知る from Masashi Shinbara

デモで書いた PHP コードは、GitHub で公開しています。Sample1, Sample2 とディレクトリが分かれています。上記資料には、対応するディレクトリを記載しているので、参考にしてみて下さい。

https://github.com/shin1x1/how-to-write-php-code-with-fizzbuzz

PhpStorm のプレゼンテーションモード

ライブコーディングには、PhpStorm のプレゼンテーションモードを使いました。エディタペインが全画面表示になるので、ライブコーディングには最適ですね。

phpstorm_presentation_mode

プレゼンテーションモードの起動は、command + shift + a で [Enter action or option name] を表示して、「presen」まで入力して、[Toggle Presentation mode]を実行しています。

phpstorm_toggle_presentaion_mode

プレゼンテーションモードから復帰する際も同じ操作を行います。

さいごに

準備の段階では、発表内容から先に進めて、処理の部分と出力の部分を別クラスにして、それを FizzBuzz に DI して、インターフェースに切り出して、インターフェースは同じだが振る舞いの異なるクラスとの差し替えてなど、発展させていっていたのですが、時間の関係もあり、削りました 😀

今回のように、誰かがコードを書いたり、操作をしたりというのを、生で見る、というのも、セッションの一つの面白さだと思うので、そこが伝わっていれば嬉しいです。

  • コメント (Close): 0
  • トラックバック (Close): 0

Laravel DB テーブルの簡易メンテ画面を作る Laravel-Table-Admin を作りました

この記事の所要時間: 532

laravel

マスタテーブルのメンテナン画面は、単純な CRUD 画面なのですが、テーブル数が多いと、いちいち作るのも手間がかかります。

そこで、Laravel のパッケージとして、Laravel-Table-Admin を作りました。

https://github.com/shin1x1/laravel-table-admin

Laravel の対象バージョンは、4.1 以降としています。

何をするものか

マスタテーブルのメンテナンス画面など、ごく単純な CRUD 画面だけを作るパッケージです。

作るといっても、コードジェネレータではなく、設定を行えば、自動でテーブルスキーマから画面を動的に構築します。CakePHP の Scaffold と似た発想です。

いわば、機能がごくシンプルになった phpMyAdmin / phpPgAdmin を Laravel アプリケーションに組み込めるというものです。

百聞は一見に一見に如かずなので、画面キャプチャを。

一覧画面です。

classes-1

編集画面です。

classes_edit-1

外部キーがある場合は、参照先テーブルの内容がプルダウンで選択できます。

riders-1

デモアプリケーションを公開しています。こういった画面を簡単に作ることができます。

http://laravel-table-admin.herokuapp.com/crud/classes

インストール

Composer でインストールします。

composer.json に以下を追加して、composer install or update して下さい。

{
    "require": {
        "shin1x1/laravel-table-admin": "~0.1.0"
    }
}

app/config/app.phpに ServiceProvider と Facade を追加します。

 'providers' => [
      // ....
      'Shin1x1\LaravelTableAdmin\TAbleAdminServiceProvider`
  ],
 'aliases' => [
      // ....
      'TableAdmin' => 'Shin1x1\LaravelTableAdmin\TableAdminFacade',
  ],

あとは、app/routes.php で、このパッケージで CRUD 画面を表示する対象のテーブルを指定するだけです。下記では、classes, nationalities, riders という3つのテーブルについて CRUD 画面を表示します。

TableAdmin::route([
    'classes',
    'nationalities',
    'riders',
]);

URL は、http://localhost/crud/{TABLE} になります。{table}の部分が、上記で指定したテーブル名になります。

これで、URL にブラウザからアクセスすると CRUD 画面が表示されます。

デモアプリケーションのコードも公開していますので、参考にして下さい。

https://github.com/shin1x1/laravel-table-admin-example

対象データベース

MySQL と PostgreSQL を対象としています。

対象テーブル

今のところ、プライマリキーがidで、一覧やプルダウンメニューでの表示カラムはnameに固定しています。

多くの場合、これで問題無いと思いますが、ニーズがあれば、設定で変更できるような対応も考えています。

実用する際のポイント

実際のところ、この画面は管理者用機能になるでしょう。TableAdmin::route()での指定では、Route::group()などを使って、認証をかけると良いでしょう。

// admin フィルターがあるとして
Route::group(['before' => 'admin'], function() {
    TableAdmin::route([
        'classes',
        'nationalities',
        'riders',
    ]);
});

Laravel-4-Generators

同様のことを行う Laravel パッケージとしては、Laravel-4-Generators が有名です。

これはとても便利なパッケージで、私も migration file のジェネレータとして良く利用しています。

大きく異なるのは、Laravel-4-Generators は、コードジェネレータですが、Laravel-Table-Admin はコードの生成は行なわず、動的にテーブルスキーマを読んで、画面を組み立てています。

双方とも良し悪しはあるのですが、動的に画面を生成した方が、画面デザインの修正などを一箇所で行うことができるので、後であれこれ変更する際は楽だと判断しました。

Laravel-4-Generators は、バージョン2 以降には、ビューテンプレートのジェネレートで、一覧画面やフォーム画面の詳細部分が生成されなくなりました。これにより、単純にジェネレートしても、CRUD画面が作れなくなっています。これも本パッケージを作ろうと思った動機の一つです。

さいごに

自分が欲しかったので、作ってみました。今のところ、必要最低限を実装したという状態です。

あとは、付加機能(一覧での検索や並び替え、テーブルカラムの対応等)を足していこうと思っています。コントリビュートもお待ちしています:D

https://github.com/shin1x1/laravel-table-admin

  • コメント (Close): 0
  • トラックバック (Close): 0

はじめてのPHPカンファレンス関西

この記事の所要時間: 540

いよいよ、今週末にPHP カンファレンス関西 2014が開催されます。

8937271164_f52e8831af_z
Photo by tenshow

今年で、4 回目の開催となるのですが、こうしたイベントに初めて参加する、という方も多いのではないでしょうか。

そこで、リレーブログ 12 日目の今日は、はじめてカンファレンスに参加する方に向けて、気になるあれこれを書いてみたいと思います。

(昨日のリレーブログは、@tanakahisateru さんの うまれかわるMVC 〜PHPカンファレンス関西2014にむけてでした。)

服装

いきなり服装?という人がいるかもしれませんが、実は初めてだと気になったりします。

みんなスーツとかだったらどうしよう。いちおうジャケットくらい羽織ろうかな、いや、Tシャツとデニムの人ばかりだと浮くかも、うーーん。。。

分かります。ちゃんとしてる人ほど気になるポイントですね。

はい、お答えしましょう。

外を出歩く一般的な服装であれば、何でも ok です。

休日にヨドバシカメラに行く服装だと思って貰えれば良いかと。

カジュアルな方が多いですが、中にはジャケットを羽織っている方もいますし、このあたりは日頃の服装ですね。

気軽な服装でお越し下さい 😀

会場へのアクセス

まずは、会場へアクセスについて。

公式サイトに地図があるので、こちらを参考に。地下鉄でいうと堺筋本町駅から歩くのが良いですね。駐車場等はあまり無いので、公共交通機関で行きましょう。(懇親会がありますしね!)

http://conference.kphpug.jp/2014/#access

駅を降りて、迷ってしまうという人は、下記リンクをスマートフォンで開けるようにしておきましょう。会場の方角を指してくれるので、この指示どおり歩けば、会場に向かうことができます。

https://bit.ly/phpcon_kansai

来場時間

会場に来る時間帯ですが、10:00 開場となっていますので、10:00 頃に来て頂ければ大丈夫です。

なお、1F には(小さいですが)カフェがあるので、早めに来て、こちらで朝ごはんを食べるというのも良いですね。(堺筋本町駅から会場までの道中でも、カフェが何件かあったはず)

受付

会場に着いたら、まず受付をしましょう。受付は、4F で行っています。(6Fもセッション会場ですが、受付は 4F なのでお間違い無く。)

まずはエレベータで 4F へどうぞ。

セッション

セッションは、しっかり話を聞いて、楽しみましょう。

学校の授業ではないので、かしこまって聞く必要はありません。面白いところは笑い、気になることは質問してみても良いですね。

基調講演の後は、マルチトラックになるので、聞きたいセッションに移動します。6F のセッションは、定員が少なめなので、どれにしようかなと迷ってる内に埋まってしまう可能性があります。

事前にどのセッションに行くか決めておくと良いです。

昼ごはん

さて、午前のセッションが終わって、昼ごはんです。

昼ごはんは、会場周辺のご飯屋さんに行きます。昼時は混んでしまうので、昼一で聴きたいセッションがある人は時間を気にしながら昼食を取りましょう。

出展ブースと丸善&ジュンク堂

セッションの合間には、出展ブースに立ち寄ってみましょう。

色々なデモや展示があるので、セッションとはまた違った楽しさがあります。ステッカーなどノベルティの配布もあるので、それらを集めて回るのも良いですね。

また、今回は、丸善&ジュンク堂さんの出張販売ブースがあります!

話題の技術書を販売して頂けるので、この機会にぜひ手にとってみて下さい。書籍を執筆された方によるサイン会なども企画しているので、ぜひ直接お話をしてみて下さい。

電源、WiFi

いまどき気をつけておきたいのが、電源と WiFi についてです。

残念ながら、参加者用のインターネット回線(WiFi)は、用意していません。ご了承下さい。

また、電源についても、一部ではご用意していますが、皆さんが充電できるほどではありません。譲り合って利用して頂くようにお願いします。

Twitter / Facebook

もちろん、Twitter や Facebook でも交流できるチャネルを用意していますよ。

Twitter の公式ハッシュタグは「#phpkansai」です。関西PHP勉強会と共通なので、すでに tweet が流れていますね。

当日は、トラックごとにハッシュタグを設ける予定です。セッション内容については、トラック専用のハッシュタグと「#phpkansai」を両方付けると良いです。

Facebook には、参加者の方同士で交流できるようにグループを作成しました!カンファレンスに参加される方であれば、どなたでもどうぞ。

https://www.facebook.com/groups/218826904993793/

ぼっちだけど…

イベントに意気込んで参加したものの、なんだか周りは仲良さそうで、楽しそう。自分だけ一人でなんだかなあ、ということがあります。

わかります。

そんな時は、まずは「ぼっちでも ok」と思いましょう。一人で参加して、誰とも話さず帰る。全然 ok です。セッションやブースを楽しめれば、それで ok 。何ら問題無しです。ぼっち上等。

でも、少しでも誰かと話したいなあという人は、ちょっぴり勇気を出して話してみましょう。

話しかけるのが難しければ、Twitter や Facebook で、これこれの話がしてみたい、とか投稿するだけでも良いです。参加者はわりと見ているので、誰かが返信をくれるかもしれません。少しでもやりとりがあれば、面と向かっても話しやすいものです。

そういった意味では、当日までに、Twitter や Facebook で自己紹介がてら何か投稿しておくと、「あ、○○と書いてた人だ」と認識してもらえて楽ですよ。

ちなみに以前、下記のようなエントリを書きました。ぼっちで少し不安という人は、読んでみて下さい。

懇親会を楽しむ5つの方法

いよいよ今週末!

さあ、今週末にはカンファレンス当日になります。

これ不安だな、気になるなという方は、Twitter で「#phpkansai」を付けて tweet するか、Facebook グループへ投稿して下さい。

当日は一緒に楽しみましょうー!

ちなみに、私は、スタッフもやりますが、午後に「PHPコードではなく、PHPコードの「書き方」を知ろう」という発表も行います。セッションに参加される方、よろしくお願いします!

リレーブログ、明日は @msng さんの 頭ん中 ですー。

  • コメント (Close): 0
  • トラックバック (Close): 0

Heroku で作るスケーラブルな PHP アプリケーション

この記事の所要時間: 221

第16回関西PHP勉強会で、「Heroku で作るスケーラブルな PHP アプリケーション」という発表をしてきました。

heroku-logo-light

発表資料

Heroku でちゃんと動く PHP アプリケーションを作ると、自然とスケーラブルな構成になりますよ、という内容です。

会場でも、Heroku 自体は知っているが、まだ使ってはいないという人が多かったので、細かな Tips は省いて、こういった構成でやりますよというイメージをお話しました。

実際に構築する上での Tips などは、また別の機会に話してみたいです。

サンプルアプリケーション

サンプルアプリケーションとして、簡単な画像アップロードサイトを Laravel 4.2 で作りました。

https://github.com/shin1x1/laravel-on-heroku

アプリケーションデータは、以下のアドオンへ保存するようにしています。画像ファイルは、アドオンではなく、S3 に保存しています。

  • データベース = Heroku Postgres
  • ログ = Papertrail
  • セッションストレージ = Redis To Go
  • 画像ファイル = S3(AWS)

使い方は、README.md に記載しているのですが、Heroku 関係は、heroku_create というシェルスクリプトにまとめています。

これを流せば、Heroku アプリケーションの作成、環境変数追加、アドオン追加などをひと息で行うことができます。

#!/bin/sh

heroku create -r heroku
heroku config:set LARAVEL_ENV=heroku

heroku addons:add heroku-postgresql
heroku addons:add newrelic:stark
heroku addons:add scheduler
heroku addons:add sendgrid
heroku addons:add redistogo
heroku addons:add papertrail
heroku addons:add librato

デモ用に Heroku にデプロイしています。

http://infinite-caverns-8536.herokuapp.com/

さいごに

Heroku は、無料から使えるのが良いですね。アドオンも機能制限(保存レコード数等)版ながら無料で使えるものが多いので、アプリケーションからの連携を試すことができます。

スケーラブルな PHP アプリケーションを作る練習場として、Heroku を触ってみるというのも面白いですよ。

  • コメント (Close): 0
  • トラックバック (Close): 0

PHP で配列を走査して処理するのは、for / foreach だけじゃない

この記事の所要時間: 918

PHP で配列の要素にアクセスして、処理を行うには、for や foreach を使うのがおなじみです。

php-logo

この方法でも良いのですが、PHPには、それ以外にも配列を走査する関数やライブラリがあります。ここでは、配列を走査して処理を行う方法を見てみましょう。

サンプル仕様

このエントリで以下の配列を処理対象とします。array.phpで保存されている想定です。

<?php
return [
    [
        'id' => 1,
        'year' => 1993,
        'name' => 'Harada',
    ],
    [
        'id' => 2,
        'year' => 2001,
        'name' => 'Kato',
    ],
    [
        'id' => 3,
        'year' => 2009,
        'name' => 'Aoyama',
    ]
];

この配列について処理を行います。

  • 配列内に連想配列が格納されており、nameyearというキーを持つ
  • yearが、2000以上の要素のみ、結果配列に格納する
  • 結果配列には、nameyearを連結した文字列を格納する

求める結果は、以下になります。

array(2) {
  [0] =>
  string(8) "2001Kato"
  [1] =>
  string(10) "2009Aoyama"
}

foreach を使う

まずは、foreach を使う方法です。よくある手続き的なPHPコードですね。foreachで配列を回して、yearが2000以上の場合だけ、結果配列に値を入れています。

<?php
$array = include('array.php');

$result = [];

foreach ($array as $v) {
    if ($v['year'] <  2000) {
        continue;
    }

    $result[] = $v['year'] . $v['name'];
}

var_dump($result);

array系関数を使う

次に、filter と map を使って、実装します。PHP には、array_maparray_filter関数があるので、これを使います。

実装は下記になります。array_filterarray_mapを使うので、それぞれ配列の要素をフィルタリングする、要素に処理を行い、結果配列を格納するといった意図がより明確になります。

ただ、array_fileterarray_mapで引数の順序が異なるのと、2 行に分かれており、中間の結果を保持する一時変数が必要になるのが難点です。

<?php
$array = include('array.php');

$tmp = array_filter($array, function($v) {
    return $v['year'] >= 2000;
});

$result = array_map(function($v) {
    return $v['year'] . $v['name'] ;
}, $tmp);

var_dump($result);

試しに 1 行にまとめると下記になります。一見良さそうですが、このコードをぱっと見て、array_filterが先に適用されるのと認識できるでしょうか。

$result = array_map(function($v) {
    return $v['year'] . $v['name'] ;
}, array_filter($array, function($v) {
    return $v['year'] >= 2000;
}));

Laravel(Illuminate\Supportパッケージ)を使う

filter / map を使う別の例として、Illuminate\Supportパッケージ のIlluminate\Support\Collectionクラスを使います。

https://github.com/illuminate/support

Illuminate\Support パッケージは、Laravel を構成しているパッケージの一つで、フレームワークを使わずとも、このパッケージ単体でも利用することができます。

インストールするには、composer.jsonに以下のように指定して、composer installもしくはcomposer updateを実行します。

{
    "require": {
        "illuminate/support": "~4.2"
    }
}

Illuminate\Support\Collectionを使うことで、メソッドチェインで配列を操作することができます。

実装すると下記のようになります。filterメソッドでフィルタリングを行い、その結果配列に対してmapメソッドを実行して、結果配列の要素を作成していることが分かります。

<?php
use IlluminateSupportCollection;

require_once __DIR__ . '/vendor/autoload.php';

$array = include('array.php');

$result = Collection::make($array)->filter(function ($v) {
    return $v['year'] >= 2000;      // filter

})->map(function ($v) {
    return $v['year'] . $v['name']; // map

})->toArray();

var_dump($result);

Ginq を使う

Illuminate\Support\Collectionと似た機能を持つライブラリに、Ginq があります。こちらもメソッドチェインで配列への操作を行うことができます。

https://github.com/akanehara/ginq

インストールするには、composer.jsonに以下のように指定して、composer installもしくはcomposer updateを実行します。

{
    "require": {
        "ginq/ginq": "~0.1"
    }
}

Ginq を使って、実装すると、下記のようになります。配列を取り込むところ以外は、Illuminate\Support\Collectionと全く一緒になりました。

<?php
require_once __DIR__ . '/vendor/autoload.php';

$array = include('array.php');

$result = Ginq::from($array)->filter(function ($v) {
    return $v['year'] >= 2000;      // filter

})->map(function ($v) {
    return $v['year'] . $v['name']; // map

})->toArray();

var_dump($result);

さいごに

4 つのパターンで配列を走査して、結果配列を求めるという処理を書いてみました。

foreach は、配列の要素を走査していくという汎用的な役割なので、そのループの中で様々な処理を書くことができます。一方、array系関数やライブラリは、それぞれのメソッドで用途や目的が決まっているので、どのような処理を行い、結果、どのような解を求めているのが分かりやすいです。

また、filter や map という概念は、多くのプログラミング言語で利用されており、こうした概念をおさえておくと、別の言語でコードを書いたり、読んだりする際に、意図を汲むことができ理解しやすくなります。

foreach で書くことがダメだというわけではなく、それ以外の書き方が、PHPにもあるということを知っておくということが大事ですね。

Illuminate\Support\Collection と Ginq

Illuminate\Support\Collection と Ginq は、Linq to Object ライクなインターフェースを持ち、実際に使い方も似ています。

ただ、この2つで大きく違うのが、評価のタイミングです。

Illuminate\Support\Collection は、mapメソッドを実行したタイミングで即時に評価され、処理が行われます。

一方、Ginqは、遅延評価となっており、mapメソッドを実行してもすぐに map 処理が行われません。このエントリの例では、toArray()が実行されたタイミングで、はじめて map 処理が行われます。

実際に利用する際は、この評価タイミングの違いは、意識しておく必要があります。

参考

迫り来る「forおじさん」と呼ばれる時代

  • コメント (Close): 0
  • トラックバック (Close): 0

PHP 定義されている情報(クラス、関数、変数等)を取得する関数まとめ

  • 2014-06-04 (水)
  • PHP
この記事の所要時間: 124

PHP には、定義されているクラスや関数、変数などの一覧を取得する関数があります。

php-logo

ここでは定義情報を取得できる関数群をまとめてみました。ここでは実行例として、Laravel アプリケーションのビューテンプレート(hoge.blade.php)で実行した内容を記載しています。

定義された情報を取得する関数群

get_defined_constants()

定義されている定数を連想配列として取得します。キーが定数名で、要素がその値となっています。

http://www.php.net/manual/ja/function.get-defined-constants.php

出力してみると、1771 個の定数がありました。内容を見ると、フレームワークやアプリケーションで定義されたものの他に、PHP本体や extension で多数の定数が定義されていることがわかります。

array (size=1771)
  'E_ERROR' => int 1
  'E_RECOVERABLE_ERROR' => int 4096
  'E_WARNING' => int 2
...

get_declared_classes()

定義されているのクラスの名前が配列として取得します。

http://www.php.net/manual/ja/function.get-declared-classes.php

304 個のクラスが定義されていました。

array (size=304)
  0 => string 'stdClass' (length=8)
  1 => string 'Exception' (length=9)
  2 => string 'ErrorException' (length=14)
  3 => string 'Closure' (length=7)
...

get_declared_interfaces()

定義されているインターフェイスを配列として取得します。

http://www.php.net/manual/ja/function.get-declared-interfaces.php

55 個のインターフェイスが定義されていました。

array (size=55)
  0 => string 'Traversable' (length=11)
  1 => string 'IteratorAggregate' (length=17)
  2 => string 'Iterator' (length=8)
  3 => string 'ArrayAccess' (length=11)
...

get_declared_traits()

定義されているトレイトを配列として取得します。

http://www.php.net/manual/ja/function.get-declared-traits.php

トレイトの定義が無かったので、サンプルとして Foo をトレイトとして定義しています。

array (size=1)
  0 => string 'Foo' (length=3)

get_defined_functions()

定義されている関数を連想配列として取得します。

http://www.php.net/manual/ja/function.get-defined-functions.php

連想配列には2つのキーがあり、internalには内部関数、userにはユーザ定義関数が配列として格納されています。

ここでは、1,686個(!)の内部関数と74個のユーザ定義関数がありました。

array (size=2)
  'internal' => 
    array (size=1686)
      0 => string 'zend_version' (length=12)
      1 => string 'func_num_args' (length=13)
      2 => string 'func_get_arg' (length=12)
      3 => string 'func_get_args' (length=13)
...
 'user' => 
    array (size=74)
      0 => string 'composerrequirea978da05ae47fd0758967870dd5a04f2' (length=47)
      1 => string 'composerautoloadincludefile' (length=29)
      2 => string 'crypt_random_string' (length=19)
      3 => string '_swiftmailer_init' (length=17)

get_defined_vars()

全ての定義済の変数を連想配列で取得します。

http://www.php.net/manual/ja/function.get-defined-vars.php

連想配列のキーに変数名、要素が変数値となっています。

array (size=6)
  '__path' => string '/share/app/config/../views/login.php' (length=36)
  '__data' => 
    array (size=4)
      '__env' => 
        object(IlluminateViewEnvironment)[208]
          protected 'engines' => 
            object(IlluminateViewEnginesEngineResolver)[202]
              ...
          protected 'finder' => 
            object(IlluminateViewFileViewFinder)[207]
              ...
...

get_included_files() / get_required_files()

include または require で読み込まれたファイル名を配列として取得します。

http://www.php.net/manual/ja/function.get-included-files.php

255 個のファイルが読み込まれていました。get_required_files()は、get_included_files()のエイリアスとなっているので、実行結果はどちらでも同じです。

array (size=225)
  0 => string '/share/public/index.php' (length=23)
  1 => string '/share/bootstrap/autoload.php' (length=29)
  2 => string '/share/vendor/autoload.php' (length=26)
  3 => string '/share/vendor/composer/autoload_real.php' (length=40)
...

get_loaded_extensions()

コンパイル/ロードされているモジュールを配列として取得します。

http://www.php.net/manual/ja/function.get-loaded-extensions.php

58 個のモジュールが有効になっていました。

array (size=58)
  0 => string 'Core' (length=4)
  1 => string 'date' (length=4)
  2 => string 'ereg' (length=4)
  3 => string 'libxml' (length=6)

なお、get_loaded_extensions()では、引数に真偽値を指定することができ、trueを渡すと、Zend 拡張モジュールのみを取得します。

実行してみると、下記の 2 つだけでした。

array (size=2)
  0 => string 'Zend OPcache' (length=12)
  1 => string 'Xdebug' (length=6)

ini_get_all()

設定値を連想配列として取得します。

http://www.php.net/manual/ja/function.ini-get-all.php

下記エントリで実行結果を記載していますので、ご参考まで。

http://qiita.com/shin1x1/items/f469bfb73c396007f911

使いどころ

色々と使いどころはあるのですが、便利な使い方を一つ。

フレームワークのビューテンプレートで、定義(バインド)されている変数をリストアップします。CakePHPやLaravelなどのフレームワークでは、ビューテンプレートをビュークラスのメソッドで読み込んで実行するので、ビューテンプレート内はこのメソッドのコンテキストで実行されることになります。

get_defined_vars()を使うことで、実際にはどのような変数がビューテンプレートで定義されているかを確認できます。

下記が、Laravel ビューテンプレートでget_defined_vars()を実行した例です。このビューテンプレートでは 6 つの変数が定義されており、$__path$__data$__env$app$errors$loginUserとして利用できることが分かります。

このように、マニュアルなどのドキュメントを見ずとも、コードで利用できる変数を知ることができます。

<?php var_dump(array_keys(get_defined_vars())) ?>

array (size=6)
  0 => string '__path' (length=6)
  1 => string '__data' (length=6)
  2 => string '__env' (length=5)
  3 => string 'app' (length=3)
  4 => string 'errors' (length=6)
  5 => string 'loginUser' (length=9)

他には、クロージャ内でget_defined_vars()を実行して、スコープにある変数がどれかを確認したり、PHPの挙動を知るのにも使えます。

さいごに

こういった定義を確認する関数群は日々使うというわけではありません。ただ、知っておくと、アプリケーションのデバッグや、フレームワークの挙動を確認したりする際に役立ちます。

日々開発しているPHPコードの定義情報を見てみると、新たな発見があるかもしれませんよ。

このエントリで紹介した関数群を書いたコード Gist に置いてます。参考まで。

追記

このエントリでは、配列で取得する関数を取り上げましたが、コマンドラインでも取得できます。extension で定義されているクラスや設定を見るなら、コマンドの方が手軽ですね。

$ php -h
...
  --rf       Show information about function .
  --rc       Show information about class .
  --re       Show information about extension .
  --rz       Show information about Zend extension .
  --ri       Show configuration for extension .
  • コメント (Close): 0
  • トラックバック (Close): 0

Home > アーカイブ > 2014-06

検索
フィード
メタ情報

Return to page top