タグ

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

  • PHPのinterfaceとは何か

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

    PHPのinterfaceとは何か
    koriym
    koriym 2013/10/15
    Java's 'interface' is a direct rip-off of Obj-C's 'protocol' http://goo.gl/nRG5G4 / パクリといってもJavaのinterfaceもObjective-Cから
  • RecursiveTreeIteratorでtreeコマンドを実装する

    Qiitaに投稿した内容なんですが、もうちょい詳しく書いてみます。 treeコマンドというのは、ディレクトリの一覧をアスキーアートでわかりやすく表示してくれるコマンドです。 $ tree -d php-XML_Builder/ php-XML_Builder/ |-- lib | `-- XML | `-- Builder `-- test `-- coverage OSによっては標準で入っていないことがあるので、Iteratorの勉強がてら、これをPHPで実装する方法を考えてみました。 と言っても、treeコマンドのために生まれてきたようなRecursiveTreeIteratorというクラスが既にあり(PHP5.3以降)、これを使えばかなり簡単に実装できます。 ■処理の流れ RecursiveDirectoryIteratorで目的のディレクトリをイテレーターにする 必要に応じてRec

    RecursiveTreeIteratorでtreeコマンドを実装する
    koriym
    koriym 2012/08/07
  • メソッドチェーンDSLでブロックを作るテクニック

    PHP勉強会でうまく説明できなかったので、ちゃんとした説明を。PHPが対象ですが、たぶんほかの言語でも応用できる話です。 メソッドチェーンで言語内DSLを作るとき、ブロック状の構文のようなものが必要になることがあります。XML_BuilderではXMLのツリー状の構文を再現するため、この構文を多用しています。 <?php XML_Builder::factory() ->root() ->child1() ->child2() ->child3_() ->_() ->_() ->_() ->_echo(); わかりやすいようインデントしましたが、単にthisを返し続けるメソッドチェーンならば意味的にブロックはないわけで、こんな構文を作るのはつらいものがあります。 XML_Builderでも悩みまして、いろいろ考えた結果、コンテキストをオブジェクトとして実装しました。詳しく説明していきます。

    メソッドチェーンDSLでブロックを作るテクニック
    koriym
    koriym 2012/06/07
  • 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メソッドを加える
    koriym
    koriym 2012/05/07
  • 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
    koriym
    koriym 2011/12/07
    マニュアルより分かりやすい素晴らしい説明
  • JavaScriptとprivateの見果てぬ夢 (JavaScript Advent Calendar 2011 オレ標準コース 6日目)

    JavaScriptとprivateの見果てぬ夢 (JavaScript Advent Calendar 2011 オレ標準コース 6日目) JavaScript Advent Calendar 2011(オレ標準コース)6日目です。他の方々のレベルが高すぎてビクビクしながら書いてます。 JavaScriptのオブジェクト指向は若干クセがあります。他のオブジェクト指向言語を使ってきた人にとって気になるのは、privateが作れないことでしょう。JSで教科書通り素直にクラス(もどき)を書くと、オブジェクトのプロパティは全てpublic、完全にオープンなものになってしまいます。 var Klass = function(){}; Klass.prototype = { methodA: function(){ ... }, methodB: function(){ ... } }; //---

    JavaScriptとprivateの見果てぬ夢 (JavaScript Advent Calendar 2011 オレ標準コース 6日目)
    koriym
    koriym 2011/12/06
  • PHP:何でもメソッドチェーン化するChainize()を作ってみた

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

    PHP:何でもメソッドチェーン化するChainize()を作ってみた
    koriym
    koriym 2011/11/18
  • Architect Note

    プログラミングのネタを思いつくままに。

    Architect Note
    koriym
    koriym 2011/11/11
    利用する側ではなくて利用される側に
  • 1