タグ

ブックマーク / blog.tojiru.net (21)

  • 型宣言を利用した自動的プログラミング(という夢)

    PHPアドベントカレンダー2016の2日目です。この記事に合わせてライブラリでも作ろうと思ってたのですが、全然間に合わなかったので夢という体でポエムを書こうと思います。 祝7.1リリース ちょうど記事を書いていたらPHP7.1がリリースされていました。おめでとうございます!みんな今すぐビルドするんだ! http://php.net/archive/2016.php#id2016-12-01-3 去年も12月1日に7.0がリリースされてたので、毎年JSTだと12月2日に新しいPHPが手に入るような感じですね。 今回はマイナーバージョンアップなのでそんなに劇的な機能はありませんが、個人的にはiterable型が超欲しかったやつです。 Nullable types Void return type Iterable pseudo-type Class constant visiblity mod

    型宣言を利用した自動的プログラミング(という夢)
  • packagist内でlaravelの定義が巨大すぎて困る

    ここでぼやいても誰にも伝わらない気がするけど、一旦吐き出しておきます。 事の経緯 私は https://packagist.org のミラーサイト packagist.jp を運営しています。 スクレイピングのプログラムがバグっていて、1ヶ月に一度ぐらい古くなったファイルを掃除して回る定期作業があるのですが、その中で妙にlaravel関連のパッケージ情報が巨大であることに気づきました。 例えば、私のMacのローカルキャッシュに残っているパッケージ情報をファイルサイズでsortすると、上位は全てlaravel関連のものになります。これらはpackagist.jpの中にミラーリングされているファイルと全く同じものです。 1971473 p-provider-2016-01.json 2058474 p-provider-2016-04.json 3687200 provider-illumin

    packagist内でlaravelの定義が巨大すぎて困る
  • PHP7でクラスはバラバラになった

    PHP7では無名クラスが導入されます。 PHP7調査(26)無名クラスの導入 - Qiita これ、単に構文だけの話にせず、「クラスの第3の能力が単独で切り出された」と捉えると面白いのかなと思いました。 クラスが持つ3つの役割 クラスが持つ3つの役割 - 西尾泰和のはてなダイアリー 「コーディングを支える技術」の西尾泰和氏によると、クラスには ユーザー定義型 実装の再利用の単位 インスタンス生成器 の3つの役割があるといいます。 クラスが扱いづらい概念だとすれば、それはこの3つの能力をまとめて持っているからです。 PHPのユーザー定義型、インターフェース PHPの場合、タイプヒントがありますし、定義したクラスは後から拡張することができません(オープンクラスではない)。 if ($obj instanceof FooClass) { //... } この「$objがFooClassのインスタ

    PHP7でクラスはバラバラになった
  • switch文を使ってはいけない

    昔Qiitaで書いた内容なんですが、PHPswitch文は悪名高い「==」演算子で比較を行います。 <?php switch (true) { case 0: echo '数字の0'; break; case '0': echo '文字列の0'; break; case '0.0': echo '文字列の0.0'; break; case true: echo '真偽値のtrue'; break; } このコードは「文字列の0.0」を出力します。大変分かりにくいですね。 この点はif ... elseif ...を使えば解決するんですが、switchで書きたくなるようなコードをelseifにするとおそらく読みにくくなるでしょう。 ではどうするか。 正解はオブジェクトのポリモーフィズム(多態性)機能を使うことです。 といっても、多態性で調べて出てくる記事とか書籍に関しては抽象的な説明が多い

    switch文を使ってはいけない
  • PHPの名前空間の効果的な使い方を考える

    PHPは5.3から名前空間が導入され、名前の衝突を避けるため長いクラス名をつけることから解放されました。しかしながら、名前空間を使ったコードは、名前空間を使っていないものに比べて当に読みやすくなっているのでしょうか? ここで例を挙げます。PHPの良質なソースコードと言えば、私はZend Framework(ZF)やSymfonyを思い浮かべるのですが、ZFのとあるクラスの冒頭を見てみましょう。 https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/View/Console/RouteNotFoundStrategy.php <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframewo

    PHPの名前空間の効果的な使い方を考える
    heavenshell
    heavenshell 2014/01/27
    個人的にはそのパッケージで他のどのパッケージが使われてるか一目瞭然だから use 並んでる方が好き。
  • トランザクションは再利用の敵である

    釣りっぽいタイトル。「RDBのトランザクションが絡むとアプリケーション側のプログラムが書きにくくなる」という話です。 もちろんですが、RDBのトランザクション機能は偉大であり、Webアプリケーションでも意識して使わなければならず、「トランザクションなんて使うな」と言いたいわけではありません。 合成できない関数 PHPで素のPDOから考えます。たとえば、以下の関数に問題はあるでしょうか? <?php /* * 古いデータをアーカイブテーブルに移す関数のイメージ */ function moveDataToArchive(PDO $db) { $db->beginTransaction(); try { $db->exec(' INSERT INTO archives SELECT * FROM data WHERE published < CURRENT_DATE '); $db->exec

    トランザクションは再利用の敵である
  • PHPのinterfaceとは何か

    久しぶりの更新です。最近、修行だと思って色々なを読み漁っているのですが、やっとこさPHPのinterfaceが分かるようになってきた感じがあるので、まとめてみます。 インターフェースは、クラスから"ユーザー定義型"の能力のみを分離した言語機構です。PHPのそれはJavaのinterfaceのパクリです。 "ユーザー定義型"という単語を使いました。動的型付き言語のことを「型のない言語」と言う人がたまにいるんですが、とんでもねー間違いです。PHPにだって型はあります。変数が型を持たず、値が型を持っているというだけの話です。 interfaceを宣言する文法はクラスとよく似ていますが、キーワードclassの代わりにキーワードinterfaceを使います。中身は定義のないメソッドの宣言を書きます。なお、定数も含めることが可能です。 <?php interface FooInterface { c

    PHPのinterfaceとは何か
  • PSR-3 Logger Interfaceの話

    PSR-3自体の内容と言うよりは、ロガーは重要だとかロガーのインターフェースが標準化されることによってどんなうれしいことがあるかとか、主にその辺をまとめています。 今のところPSR-3対応のライブラリは数えるほどしかなく、PHP-FIGの理想は達成できるのかどうか、、というところですが、日語圏で紹介している人が皆無という印象だったのであえて題材に選びました。 会場提供をしてくださったEngine Yardさんありがとうございます。

    PSR-3 Logger Interfaceの話
  • composer searchが非常に遅い件

    PHP界で流行っているパッケージ依存管理ツールComposerですが、使っているでしょうか。似たようなツールはだんだん淘汰されてComposerに一化され、PEARより盛り上がっている感じです。 がしかし。個人的に使った感触では、表題の通り、検索が遅くてたまらんです。(前からそうだったと思うんですが、一向に改善されないばかりか悪化しているのでは?) 実行するマシンのスペックに依存しますが、手元にあるVMPlayer上で動かしているしょぼいFreeBSDだと、composer search phpunitするだけで2分ほど動きが止まります。PackagistのWeb UI上で検索すると一瞬で結果が返ってくるのに。。 Composerにはcomposer initという、composer.jsonを対話的に作るコマンドがありますが、使いたいライブラリを一つ検索するたびに数分待たされるので、非

    composer searchが非常に遅い件
    heavenshell
    heavenshell 2013/01/13
    最初試した時に遅さにビックリした。
  • DCI in PHPについて考えてみる

    DCI(Data, Context and Interactions)というキーワードがRuby界で流行っているとか。 DCIアーキテクチャ - Trygve Reenskaug and James O. Coplien - Digital Romanticism DCIアーキテクチャについて語ってみるよ - uehaj's blog まだよく消化できていないのですが(そもそもMVCだって理解できた気がしない)、PHPではどう実装すればいいかを考えてみました。 DCI概略 斜め読みしたところ、MVCのModelが肥大化しがちなところなので、じゃあModelをData、Context、Interactionに3層分割して実装すればすっきりしますよ、という概念だと読めました。実装によってはContextではなくUseCase、InteractionではなくRoleと書いていることもあるみたい。

    DCI in PHPについて考えてみる
  • PDOの真の力を開放する - PHPでデータベースを扱う(3)

    ちょっと遅れましたが、シリーズの第3回です。前回までに論じた内容をふまえて、簡単な実装を示します。↓前回までの内容はこちら。 DAOの悪夢 - PHPでデータベースを扱う(1) - 泥のように ドメイン駆動設計という救世主 - PHPでデータベースを扱う(2) - 泥のように 題材 「記事にタグを設定できるブログ」みたいなシステムを考えてみます。ブログ記事を示すEntryテーブル、タグを表すTagテーブルの二つを用意しました。MySQL WorkbenchによるER図(鳥足記法)は以下になります。 1つのEntryに対して複数のTagがある、1対多の関係です。同じTagが複数のEntryに関連するため、多対多の関係と見なすこともできそうですが、タグ程度だとあまり意味がないので、これ以上のテーブル分割はやめておきます。 Entryテーブルの主キーがentryIdと冗長な名前をしているのは、自

    PDOの真の力を開放する - PHPでデータベースを扱う(3)
  • それでもPHPにfinallyが必要な理由

    PHP Conference 2012で知ったのですが、PHP5.5にはfinallyが搭載される見込みだそうです。 搭載されるのはいいのですが、昔、「PHPにfinallyはないけどデストラクタがあるよ」と題してfinally不要説を書いたことがあるので、もう少し考察を行ってみたいと思います。自分で自分に反論を書いてるのもアレなんですけど。 ※RFCは追いかけてなかったので、記事は想像で書いています。ツッコミください。 finally不要説 私が主張した内容を要約するとこんな感じです。 finallyの主な用途はファイルのクローズやDBの接続断などの「後始末処理」である。 後始末はデストラクタで行うこともできる。 PHPではデストラクタの動作が保障されている。(参照カウントによるGC) ゆえにデストラクタを正しく使えばfinallyは不要。 具体例を出すと、finallyのRFCでは例

    それでもPHPにfinallyが必要な理由
  • GitHub markdown APIで遊ぶよ

    markdownといえば各種言語に実装されていますが、GitHubがWeb API形式で変換ツールを出しているようなので遊んでみました。このAPIを通すと、markdownテキストがHTMLに変換されます。 JSONPで使える奴と、RESTっぽくmarkdownなテキスト自体をPOSTするとHTMLの断片が返ってくるraw APIの2つがあります。 利用上限は一時間あたり5000回と太っ腹。 とりあえず、PHP版:http://tojiru.net/markdown.php <?php if (isset($_POST['markdown'])) { $origin = $_POST['markdown']; $ch = curl_init('https://api.github.com/markdown/raw'); curl_setopt($ch, CURLOPT_RETURNTRAN

    GitHub markdown APIで遊ぶよ
  • JavaScriptにRuby風のnewメソッドを加える

    JavaScriptのオブジェクト指向はクラスベースの皮をかぶったプロトタイプベースです。機能的には十分なのですが、すっきり書く方法が公式に用意されていないので苦労します。一年前に、newを封印してJavaScriptでオブジェクト指向するなんて記事を書いたこともありました。 Rubyではnewは演算子でなくメソッドです。これをインスパイヤしてJavaScriptもnewメソッドを加えてみると、プロトタイプ的継承もすっきり書けるのではないかと思い、試してみました。ECMAScript 5の機能を使っています。当然IE6なんかでは動かないです。 newメソッドその他の定義 Object.defineProperties(Object.prototype, { new: {value: function(){ var self = Object.create(this); self.initi

    JavaScriptにRuby風のnewメソッドを加える
  • Zend Frameworkにおけるグローバル変数

    Zend Frameworkを久しぶりに使っているのですが、変数を共有する方法についてよく忘れるのでメモです。 Zend Framework 1.11.2(FreeBSDのportで入れた最新版)をベースに書いています。コマンドのバグ情報などは少し古いかもしれません。 おさらい Zend Frameworkをベースにしたアプリケーションは、こんな構造をしています。 どのレイヤーで共有するかによって、適する書き方が変わります。 PHPプログラム全域⇒グローバル変数 グローバル変数はもっともスコープが広く、そして最悪な方法です。 //代入 $GLOBALS['hoge'] = 'hoge'; //参照 echo $GLOBALS['hoge']; 後で述べる方法と比べると、使った後のプログラムはもちろん、使った行以前のプログラムにすら影響を与える点が大きな特徴です。 また、PHP特有の問題かも

    Zend Frameworkにおけるグローバル変数
    heavenshell
    heavenshell 2012/03/29
    Zend_Registry はないわー。
  • PHP5.4時代のprivateメソッドテスト手法 #php5_4

    PHP5.4 Advent Calendar 2011の7日目です。昨日は@madapajaさんの「PHP5.4+ で開発が行われている BEAR.Sunday フレームワークを動かしてみる」でした。 さてさて皆さん、ユニットテストしてますか? PHPもテストのライブラリが充実してきており、カバレッジ100%に情熱を燃やしている方も多いことでしょう。 ユニットテストで困るのが、private/protectedメソッドです。外から呼べないので、普通の方法ではテストできません。(protectedは適当なダミーのサブクラスを作ってそこからテストできますが、ちょっと面倒です。) まあ当然です。外から呼べないようにprivateにしているので、簡単に呼べたら逆に困るわけです。しかしながら、privateメソッドも外から呼んでテストできた方が開発ははかどるでしょう。この記事ではPHPでprivat

    PHP5.4時代のprivateメソッドテスト手法 #php5_4
    heavenshell
    heavenshell 2011/12/15
    private なんて飾りです!になるな。
  • PHPにfinallyはないけどデストラクタがあるよ

    PHP finallyで検索すると、「PHPにはfinallyがない。欠陥言語だ!」という主張の記事がたくさんヒットします。これに対してPHPを擁護している記事があまりなさそうなので、PHPを擁護してみることにします。 finallyとは何か まずはおさらい。 try~catch~finallyは例外処理を行うための構文です。tryで例外が発生するかもしれない処理を書き、catchで例外が発生したときの対処を書き、finallyでは例外が起きても起きなくても実行される処理を書きます。…というのが初歩的な説明ですが、このfinallyの解説は十分ではありません。 finally節は、途中でどんなことが起ころうとも必ず実行されるというかなり特殊な性質を持っています。たとえば以下のJavaScriptのコードはいずれも「try」「finally」と表示します。tryの中でgoto相当の構文を実行

    PHPにfinallyはないけどデストラクタがあるよ
    heavenshell
    heavenshell 2011/11/18
    そうは言っても finally は使いたい。
  • PHP:何でもメソッドチェーン化するChainize()を作ってみた

    ※今回、実用性とか特に考えていないネタ記事ですのでそこらへんご了承ください。 PHPは他のオブジェクト指向言語と同じように、return $thisしておけばメソッドチェーン(Method Chaining / Fluent Interface)できます。対応ライブラリも沢山あります。 慣れてくると、メソッドチェーンできないとストレスを感じるようになってきます。DOMDocumentとか、Zend_Feed_Writerとか、なぜかメソッドチェーンできなくて、むずむずします。 そこでどんなオブジェクトでも、無理やりメソッドチェーンできるようにする関数Chainize()を考えてみました。ソースは少し長くなったので最後に載せます。使い方イメージだけ先に書きます。 基的な使い方 Chainize()で囲うとメソッドチェーンできるようになります。例えば前述のZend_Feed_Writerはそ

    PHP:何でもメソッドチェーン化するChainize()を作ってみた
  • Zend Frameworkとsymfonyの比較

    Symfony2が盛り上がってる中、1の話で申し訳ないですが。symfony1.4とZend Framework1.11の両方を使う機会があったので、感じたことをまとめておきます。まだまだ理解が及ばないところもあるので、間違いとかあったら教えてくださいませm(_ _)m Zend Frameworkとsymfonyはよく似ている 中身はどうあれ、特徴だけ書き並べていくと、2つともよく似たフレームワークに見えます。 2007年にリリースされた、PHP第3世代フレームワーク(特にRailsの影響を強く受ける) PHP4サポートを切り捨て、PHP5のみ対応。E_STRICT準拠 階層のないMVC・FrontControllerといったアーキテクチャ 柔軟性・拡張性などの謳い文句 日語ドキュメントもあるよ 標準のviewは素のPHP。テンプレート継承の概念がなく、layoutで対応 PHPのフレ

    Zend Frameworkとsymfonyの比較
    heavenshell
    heavenshell 2011/10/30
    ほぼ同意
  • extensionだけで書かれたPHPフレームワーク・Yafを試してみた

    Yaf(Yet Another Framework)はextensionだけで書かれたPHPのWeb Application Frameworkです。peclをなんとなく眺めていて見つけました。フルスタックというわけではなく、コントローラーやディスパッチャの部分が主に提供されています。 Zend Frameworkの高速化記事でも書きましたが、フレームワークはライブラリをロードする部分にもっともコストがかかります。extensionで書かれている場合、このロードの時間が無視できるようになりますから、かなりの性能向上が期待できそうです。(もちろん処理自体が速くなることも期待できます) Yafのドキュメントはまだまだ充実していないようですが、MVCかつFrontController Patternを採用したアーキテクチャで、非常にZend Frameworkとよく似た構成になっています。なので

    extensionだけで書かれたPHPフレームワーク・Yafを試してみた