BlogCakePHPを中心としたサイト開発情報をメインに公開。新しもの好きなので時々製品レポートなんかも。21日目担当のMASA-Pです。CakePHP界隈ではいろいろとやらせていただいていますが、PHPコミュニティの方はなかなか日程等があわない関係もあって不参加状態ですので、もしかしたら初めましての方もいらっしゃるかもしれません。一応こんなものなんかを公開させていただいております。こんな本とかこんな本なんかを執筆させていただだいておりますので、もし興味がありましたら是非よろしくお願いします。Tipsという事なのですが、非常にお恥ずかしい話ですが当方は既にCakePHPがないと生きていけない体になっております(笑)。当方としましてもそういう道連れ的な方を一人でも多く製造したい次第ですので(笑)、布教活動がてら「CakePHPに存在している超便利な機能をライブラリとして使ってしまおう!」ということで記事を書いてみたいと思います。実例としては前日のomoonさんの記事とネタが被っているかもしれませんが、まあ続編と思ってもらっても全然構いませんです(^^;。CakePHPのフレームワークの機能についてここで多くを語るのはやめるとして、CakePHP内には「便利クラス」なるものがいくつか存在します。一押しなのが、今回取り上げさせていただく「Setクラス」です。このクラスは、配列の操作をより便利にする機能を持っています。PHPは標準でも他の言語と比べて配列を自在に操れる方だとは思いますが、かゆいところに手が届かないものもいくつかあります。このSetクラスを使うと、その辺が簡単に解決できたりする場合があります。CakePHP辞典」を参照してください。今回はこの中のSet::extract()とSet::combine()を動作サンプルとして掲載します。前置きはこのくらいにして、さっそくピュアPHPコード内でCakePHPのコードを使用する方法をご紹介しましょう。1:CakePHPのコードを配置する先でも後でも良いのですが、とりあえずCakePHPコードを配置してしまう事にします。今回は、ドキュメントルート内に利用元のピュアPHPコードを展開し、「includes/」内に利用したいCakePHPコードのファイルのみをを入れます。ドキュメントルートとは別の一にCakeのパッケージを丸ごとインストールして、そこを参照したりしても良いかもしれません。CakePHPはこちらからアーカイブを入手し、その中の「cake/libs/set.php」をincludesにコピーします。Setクラス内では同じくCakePHPライブラリである「Stringクラス」も呼び出していますので、「cake/libs/string.php」もコピーします。その他にもクラスを呼び出しているものがありますがそれは次のステップで。2:ダミークラスを作成するCakePHPのコードを使うための、超最低限の機能(?)を有するコードを作成します。includes内に「cake.php」ファイルを作成します。内容は次のようにします。$class){include(dirname(__FILE__).DS.strtolower($class).'.php');}}Objectクラスは、CakePHPのほとんどのクラスが継承している基底クラスで、ライブラリでも使用している場合があります。ダミークラスを作成して問題を起きにくくしておきます。App::import()はCakePHP内で自在にincludeするための便利メソッドで、これもライブラリ内で用いられています。SetクラスでもStringクラスを呼び出すために使用しています。本来は$typeでクラスの種類(ControllerとかModelとか)を指定するのですが、今回の実装ではincludesディレクトリに全て突っ込んでしまうため、無視します。$classはupperキャメルケースで表現されていますのでアンダースコア形式に変換する必要がありますが、今回はインチキしてstrtolower()してしまっています。厳密にやるのなら「cake/libs/inflector.php」内のメソッドを用いるとできると思います。最後に目的のコードを記述します。今回は次のようなコードで実験する事にします。'{n}.UserProfile.name');var_dump($arr);実行結果は次のようになります。}SetクラスはCakePHPユーザでもあまり使われていないかもしれないのですが、この便利さは魔力を秘めているというのか使い出したら止まりません(^^;。上記2つはデータベーステーブルから特定の値を抜き出したりする場合に威力を発揮すると思います。今回触れてはいませんが、Set::merge()やSet::sort()なんかもかなり便利です。array_merge()は1次元目の配列要素に対してのみマージが行われますが、これは多階層の配列に対して再帰的にマージが可能です。sortについても、特定のパスの値に対してソートをかける事ができるので、例えばとりあえず取ってきた複数レコードのデータをid順に並べ直したりといったことが簡単にできます。Setクラスは少々CPU%を使う仕組みだと思うので、peclかなんかでモジュールを利用する形で作ったりすると良いのかもしれませんね。いや、できればPHPで標準化されて欲しいものばかり!(笑)ぱっと見なのですが、Setクラスだけでなく次のクラスライブラリもたぶん同様の方法で使えると思います。したりキャメルケース←→アンダースコアに変換したりできるクラスStringクラスUUIDを生成したり、テンプレート文字列に要素を挿入したりできる機能のあるクラスNumberHelperクラス通貨など数値関連のフォーマッティングをしてくれるクラス。AppHelperクラスを上記のObjectクラスのようにダミー化する必要がありますTImeHelperクラス時間に関するフォーマッティングをしてくれるクラス。strtotime()等の機能をより便利に拡張します他のクラスにも有用なものがありますが、ちょっと大がかりな工夫をする必要がありそうなので、興味があったらチャレンジしてみてください(Validationクラスくらいなら比較的簡単にけるかもしれない)。アマゾンのサーバでエラーが起こっているかもしれません。一度ページを再読み込みしてみてください。(木)【プログラミング全般】私が出来る限りソースコードを公開しない理由お気づきかもしれませんが、私は滅多にソースコードを相手に提示したり公開したりしません。フォーラムなどで質問されたものに対してアドバイスはしますが、その中に適切なソースコードを書きません。言い訳めいた話をするかもしれませんが、そのようにしていることにはちゃんと理由があり、漠然とした言い方をすれば、そうすることでご自身に「学んで欲しい」からです。現在は、インターネット...もっと言えば検索サイトでのネット検索で、大抵のものは入手できる、大変便利な世の中になりました。ソースコードはいろんな所から入手でき、ダウンロードするかコピペするかでその機能を自分のものにすることが出来ます。これはこれで便利なのですが、それが原因で技術者もあまり成長していないのではないかと考えています。私はどちらかというと「旧世代」の人間で、インターネットどころか外部記憶が「カセットテープ」の頃からやっていまして、その頃は何もない「自分で作るしかない」世界でした。雑誌や書籍が唯一の参考書で、それを片手にプログラムを「手で打ち込み」身体で覚えたものです。いって、「この頃のプログラム技術が生きている」なんて野暮な言い方はしませんし、実際に現在のプログラム技術と比べたら、この頃のプログラムの知識など全く役に立ちません。「自らが苦労して得た「考え方」はいつまでも忘れない」というのは確かにあります。コピペしたものは1年もしないうちにたやすく忘れますが、自分で苦労して作ったもの(あるいは手を入れたもの)は、詳細は覚えていなくとも「どこで苦労したか」は思い出すことが出来ますし、「失敗したことは二度としない」でしょう。他で似たような現象が出れば「これもあれと同じではないだろうか?」と推測が出来ますから、確実に新しく考えなければならない範囲が狭くなるのです。ちなみに当時は機種毎に動作するプログラムが違うのは勿論、その機種そのものの絶対数も少なく、その機種用の出来合いプログラムは少なかったです。そのプログラムは大変に貴重で、自分の機種用に移植することでいろいろな勉強が出来ました。読解することで「どのような仕組みで動くのか」を自分で理解することが必要であり、そこから得たことの方が何倍も価値がありました。現在に置き換えるのであれば、PHPだろうがJavaScriptだろうが、プログラムの仕組み・考え方に本来の価値があるのであって、同じ言語であっても自分の環境に適合しているかどうかも分からないソースコードを引っ張ってくるだけではダメだということです。逆に言えば考え方さえ分かれば、素のPHPプログラムを提示されても、CakePHP用やsymfony用に作ることが出来たり、Windowsアプリや今はやりのiPhoneアプリにだって出来る、というわけです。いった「知識」をつけることは、受動的では覚えないと思います。「能動的」に経験をしなければ身につかないと思います。これが「技術」というものだと思います。「(動く)ソースを貼り付けないから不親切だ」的な書き方をされたことが過去あるのですが、私としては、そうすることで「技術を習得することを妨げてしまう」方が不親切ではないかと思います。この辺は過去苦い経験があったから言えるのかもしれませんが。CakePHPフォーラムを見ていると、(動く)ソースを要求していると思われる書き込みが最近増えているように感じます。常連さんはもちろんそんなことはないですが、CakePHPどころかプログラム経験が浅いと思われる方は、大抵ソースが出てくるのを待っているような書き込みをされます。自分でやらなくて済みますから、そりゃその方が楽だとは思います。それではいつまでも「技術」を学ぶことが出来ないと思います。いって相手も困っているのでしょうから、「考え方」だけは提示して、後は自分で考えて作ってもらう...というのが私の方針で、その質問者が憎たらしいとか、困らせてやりたいとか、そんなことは考えたこともありません。思ったら書き込まないだけなので。以上の理由からソースそのものよりも「考え方」が一番大事なのだということ、そしてその考え方について「自分も考え、行動してみる」ことが技術に繋がることを私は主張したいと思います。ちなみに、CakePHPをはじめとするフレームワークを「簡単だから」という理由だけで導入する初心者の方がいるようですが、言わせてもらうと「素のPHPで同じ機能のものを作れる人が、作業を簡素化するために使う」のは大変に有効だと思いますが、「プログラムを覚えることなく作れる」ものではないと言いたい。PHPをあまり知らなくても、知る努力はして欲しいものです。それが出来ないのであれば、誰かに作ってもらって対価を払う方が、自分のためにもみんなのためになります。アドバイスしてくれた人には、必ずお礼をして欲しい。最近質問しっぱなしでそのままのものが多すぎます。少なくとも、その人が限りある時間の一部を割いてくれたのですから、それが自分の求めていた情報ではなかったとしても、感謝の一言くらいは。情報がコピペと同じ扱いでは、可哀想すぎです。私にはどっちでも良いですけど、せめて他の人には必ずお願いします。