Home > Archives > 2011-07

2011-07

【プログラミング】Mix-inに関して

PHP5.4から新たにTraitsという機能が加わるそうです。

なんじゃそりゃ。。

ということで調べているうちにMixinという言葉にぶち当たりました。
ちなみにTraitsというのはPHPでMixinを実現する言語仕様の拡張の様です。

Mixin(ミックスイン)とは

あるクラスから継承される為のクラスであり、多重継承の利点としてある複数のクラスの機能を利用することができるもの。

Javaでは多重継承の代わりにインターフェース(仕様の継承)を提供している。
Lisp,Perl,Pythonでは多重継承を提供している。
RubyではどちらでもなくMixinを提供している。(Lisp, Perl, PythonでもMixinは使えるとのこと。)

動的言語でも複数クラスを継承したいということが多々発生し、だけど名前の衝突とかをさせたくないからMixinというものがうまれた・・・のかな。

全く使ってないので何とも言えないですが、流れと考え方はつかめたかなと思います。

参考
5分でわかる最近のPHP – 2011夏
現状のPHP環境はそのままで、PHP 5.4 を試す
PHP5.4 alpha1リリース! PHP5.3からの新機能を見わたす
PHP懇親会に参加しました
まつもと直伝 プログラミングのオキテ 第3回(3)
Mixin
継承

【プログラミング】リフレクションに関して

リフレクションに関して見ている。
普段使うことはあまり無いみたいだけど、フレームワークとかでよく使われたりしているので知っておいた方がよい!

リフレクションとは

情報工学においてリフレクション (reflection) とは、プログラムの実行過程でプログラム自身の構造を読み取ったり書き換えたりする技術のことである。 by wikipedia

つまり、プログラム内のクラス構造とかメソッド情報とかが欲しくなった際に使ってあげるといい。

対応言語は、Java, Objective-C, ActionScript, JavaScript, Ruby, Perl, Python, PHP・・・などがあるみたいです。

なかなか使いどころが難しい気がしますが、Symfony2やDoctrine2内では使われているらしいです。

まず、PHPのReflectionClassを見てみます。

<?php
printf("%-20s: \n", 'get_class_vars');
print_r(get_class_vars('ReflectionClass'));
printf("%-20s: \n", 'get_class_methods');
print_r(get_class_methods('ReflectionClass'));

結果:
get_class_vars :
Array
(
[name] =>
)
get_class_methods :
Array
(
[0] => export
[1] => __construct
[2] => __toString
[3] => getName
[4] => isInternal
[5] => isUserDefined
[6] => isInstantiable
[7] => getFileName
[8] => getStartLine
[9] => getEndLine
[10] => getDocComment
[11] => getConstructor
[12] => hasMethod
[13] => getMethod
[14] => getMethods
[15] => hasProperty
[16] => getProperty
[17] => getProperties
[18] => hasConstant
[19] => getConstants
[20] => getConstant
[21] => getInterfaces
[22] => getInterfaceNames
[23] => isInterface
[24] => isAbstract
[25] => isFinal
[26] => getModifiers
[27] => isInstance
[28] => newInstance
[29] => newInstanceArgs
[30] => getParentClass
[31] => isSubclassOf
[32] => getStaticProperties
[33] => getStaticPropertyValue
[34] => setStaticPropertyValue
[35] => getDefaultProperties
[36] => isIterateable
[37] => implementsInterface
[38] => getExtension
[39] => getExtensionName
[40] => inNamespace
[41] => getNamespaceName
[42] => getShortName
)

上記からReflectionClassを使えばあるクラスのメソッドやプロパティを取得したりできることがわかります。

参考
リフレクション (情報工学)
リフレクション
PHPでリフレクション

【Apache】hello_world_handlerとhello_world_register_hooksについて

前回書いたApacheモジュールの関数に関しての説明がなかったので、調べて説明してみる。

hello_world_handler

実際の処理をするハンドラ。
モジュール内ではハンドラ名を判定したり、Content-Typeを決めたり、文字列を設定して返却したりしている。

hello_world_register_hooks

Apache本体に登録されてここからhello_world_hanlerを呼び出す為のもの(かな)。

【実際のコード】

ap_hook_handler(hello_world_handler, NULL, NULL, APR_HOOK_MIDDLE);

ap_hook_handler

フック関数の登録処理を行うもの。

http://blog.livedoor.jp/matssaku/archives/50421540.html

【Apache】モジュールを作成

サンプルでモジュールを作成したのでコードを貼付けて解析していきます。
mod_hello_worldを作成しました。

#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"

/* The sample content handler */
static int hello_world_handler(request_rec *r)
{
    if (strcmp(r->handler, "hello_world")) {
        return DECLINED;
    }
    r->content_type = "text/html";      

    if (!r->header_only)
        ap_rputs("The sample page from mod_hello_world.c\n", r);
    return OK;
}

static void hello_world_register_hooks(apr_pool_t *p)
{
    ap_hook_handler(hello_world_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA hello_world_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                  /* create per-dir    config structures */
    NULL,                  /* merge  per-dir    config structures */
    NULL,                  /* create per-server config structures */
    NULL,                  /* merge  per-server config structures */
    NULL,                  /* table of config file commands       */
    hello_world_register_hooks  /* register hooks                      */
};

request_rec *r

構造体でinclude/httpd.hの中で定義されている。
下記に記載されていないものでは
r->pool(リクエスト毎のメモリプール)、r->args(QUERY_STRINGの値)などがある。

r->handler

処理するハンドラの名前

strcmp(a, b)

aとbの文字列を比較している。

DECLINED

次のモジュールに処理を任せるということらしい。

r->content_type

Content-Typeヘッダ

r->header_only

HEADリクエストかどうかの判定

ap_rputs

文字を出力する為の関数

return OK

処理成功

【Apache】Apacheをもうちょっと理解してみる

Apacheをもっと深く理解したいと思い、以下の記事を読んでいます。


井上の日誌 -Apacheの話-

Apacheのソースコードにも触れていてまだよくわからないですが、とりあえず読んでいます。

目標は自分でApacheモジュールを作れればよいなと。

ほぼ挫折すること120%な気もしますが、、、とりあえず時間見つけてやっていきます。

Home > Archives > 2011-07

Search
Feeds
Meta

Return to page top