Home > プログラミング

プログラミング Archive

【プログラミング】【PHP】Traitsに関して

以前にMix-Inに関して書きましたが、PHPのマニュアルにTraitsというマニュアルを見つけたのでまとめてみます。

Traits(トレイト)とは

  • PHP5.4から導入されたもの
  • PHP のような単一継承言語でコードを再利用するための仕組みのひとつ
  • 単一継承の制約を減らすために作られたもので、 いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようになる

  • 多重継承や Mixin に関連するありがちな問題を回避することもできる
  • トレイトは単にいくつかの機能をまとめるためだけのもの
  • トレイト自身のインスタンスを作成することはできない
  • クラスのメンバーにするのに継承を要しなくなる

マニュアルを箇条書きにしただけですが、こんな感じです。

参考
トレイト – PHP manual
PHP5.4のtraitを使ったシングルトンパターン実装によるtrait入門

【プログラミング】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でリフレクション

ホーム > プログラミング

Search
Feeds
Meta

Return to page top