これを使用すると、静的継承のコンテキストで呼び出し元のクラスを参照できるようになります。
具体的には以下のコードを御覧ください。
サンプルコード 実行結果
self:A static:Bと、このようにselfとstaticで呼び出し先の関数が変わってしまいます。
この時、staticの方が遅延静的束縛と呼ばれるものです。
selfとstaticという書き方一つで意図しない結果になりうるため、
使いどころは非常に注意しないといけませんね。
self:A static:Bと、このようにselfとstaticで呼び出し先の関数が変わってしまいます。
Aクラスを文字列として変換すること自体がまず無いでしょうし、
var1 => value 1 var2 => value 2 var3 => value 3 MyClass::getProperty: var1 => value 1 var2 => value 2 var3 => value 3 protected => protected var private => private var使うかな。使わなそうだなぁ…。
set a to 1 get a 1 Is a set? bool(true) Unset a Is a set? bool(false) get _p Notice: Undefined property via __get(): _p in C:\xampp\htdocs\test.php on line 51 in C:\xampp\htdocs\test.php on line 27と、このように動的にメンバ変数を作成したり、取得・削除も行うことができました。
Hello World!!以上のように、トレイトではメンバ変数とメンバ関数が継承できることが分かりました。
BenchMark 1 average:0.0052475452423096 BenchMark 2 average:0.0050734758377075includeする分autoloadの方が遅いですね。
BenchMark 1 average:0.012288689613342 BenchMark 2 average:0.0055228233337402というわけで、普通の配列の倍以上の時間がかかることが分かりました。
BenchMark 1 average:0.032666206359863 BenchMark 2 average:0.032941651344299これからはパターン1で行こうと思います。
1211パターン1とパターン3、パターン2とパターン4が同じ結果になると思ったのですが、そうはなりませんでした。
array(1) {
[1]=>
string(1) "d"
}
上の例は、keyが全て1に型キャストされる例です。
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
と、このように関数の結果を一次変数に代入しなくても次の関数の引数に設定することができるようになりました。My name is "MyName". My name is "$name".ちなみに、ヒアドキュメントもNowdocも終了識別子の行で
BenchMark 1 average:0.27803311347961 BenchMark 2 average:0.27166895866394ということで、予想通りNowdocの方が速いという結果になりました。
FLAG1 FLAG3 FLAG5サンプルコード 実行結果
FLAG1 FLAG3 FLAG5と、このように5つの変数に分けて持っていたフラグが一つの変数にまとまりました。
BenchMark 1 average:0.0023561954498291 BenchMark 2 average:0.0024597406387329可読性の問題もありますし素直に複数の変数にフラグを持ったほうがいいですね。
FALSE
NULL : bool(false)
"" : bool(false)
"0" : bool(false)
"a" : bool(true)
0 : bool(false)
1 : bool(true)
+1 : bool(true)
-1 : bool(true)
0x0A : bool(true)
012 : bool(true)
0.1 : bool(true)
1e3 : bool(true)
1e-3 : bool(true)
array("") : bool(false)
array("a") : bool(true)
array(array("a")) : bool(true)
TRUE : bool(true)
FALSE : bool(false)
object : bool(true)
fopen : bool(true)
では、肝心のベンチマークを取ってみましょう。BenchMark 1 average:0.0022930383682251 BenchMark 2 average:0.0024604082107544そして、最後に注意点をひとつ。未定義の変数を判別しようとしますと…。
Notice: Undefined variable: x in C:\xampp\htdocs\test.php on line 2と、Noticeが出てしまいます。
BenchMark 1 average:0.0086915016174316 BenchMark 2 average:0.070313191413879 BenchMark 3 average:0.009862232208252 BenchMark 4 average:0.0227707862854こちらも綺麗に結果が出ましたね。
strtr cba abc cba abc str_replace abc abc cba cba preg_replace abc abc cba cbaと、上記のようにstrtrでは配列の順序に関わらず一定の結果を返すのに対し、
BenchMark 1 BenchMark 1 average:0.016364622116089 BenchMark 2 average:0.019233679771423 BenchMark 3 average:0.045470118522644きれいに結果に差が出ましたね。
$str = 'abcde'; substr($str, -1);方法2
$str = 'abcde';
$str{strlen($str)-1};
サンプルコード
実行結果
BenchMark 1 average:0.0076918125152588 BenchMark 2 average:0.0067881345748901あんまり差がつきませんでしたね。
bool(true) bool(true) bool(true) bool(true) bool(false) bool(false) bool(false) bool(false)と、文字列のオフセットに数値以外の値を渡した場合、結果はFALSEになります。
scandir
array(11) {
[0]=>
string(1) "."
[1]=>
string(2) ".."
[2]=>
string(9) ".htaccess"
[3]=>
string(13) "BenchMark.php"
[4]=>
string(8) "Util.php"
[5]=>
string(14) "Validation.php"
[6]=>
string(3) "doc"
[7]=>
string(3) "git"
[8]=>
string(9) "index.php"
[9]=>
string(8) "test.php"
[10]=>
string(9) "test2.php"
}
glob
array(8) {
[0]=>
string(13) "BenchMark.php"
[1]=>
string(8) "Util.php"
[2]=>
string(14) "Validation.php"
[3]=>
string(3) "doc"
[4]=>
string(3) "git"
[5]=>
string(9) "index.php"
[6]=>
string(8) "test.php"
[7]=>
string(9) "test2.php"
}
上記の結果のように、scandirではカレントディレクトリを表す"."と、親ディレクトリを表す".."、int(2147483647) float(2147483648) int(-2147483648)と、このような現象が起こる場合もあります。
BenchMark 1 average:0.01190493106842 BenchMark 2 average:0.012681221961975三項演算子は遅いという印象はありましたが
BenchMark 1 average:0.51706559658051 BenchMark 2 average:0.51087384223938この結果を見るには大差無さそうですね。
Array
(
[0] => a0
[1] => a1
[2] => a2
[a] => ba
[b] => bb
[c] => bc
[3] => b0
[4] => b1
[5] => b2
)
Array
(
[0] => a0
[1] => a1
[2] => a2
[a] => aa
[b] => ab
[c] => ac
)
ということで、表にまとめるとこのような感じになります。| 数値 | 文字列 | |
|---|---|---|
| array_merge | 後の配列は後ろに追加 | 後の配列の値で上書き |
| + | 前の配列の値で上書き | 前の配列の値で上書き |
BenchMark 1 average:0.029446578025818 BenchMark 2 average:0.011990690231323やっぱりarray_mergeを使わない方が速いですね。
Warning: Cannot modify header information - headers already sent byと、このようにWarningが発生し、リダイレクトしてくれません。
BenchMark 1 average:1.4885204076767 BenchMark 2 average:1.8529042959213 BenchMark 3 average:0.45898940563202 BenchMark 4 average:0.46037158966064この結果より何度もphpの開閉タグを開いたりechoで直接出力するよりも
BenchMark 1 average:0.51002349853516 BenchMark 2 average:0.5392422914505これですとパターン1の方が速いですね。
BenchMark 1 average:0.25352725982666 BenchMark 2 average:0.099978256225586 BenchMark 3 average:0.10105469226837 BenchMark 4 average:0.10030741691589 BenchMark 5 average:0.099922490119934 BenchMark 6 average:0.098655319213867変数ありの場合
BenchMark 1 average:0.25069181919098 BenchMark 2 average:0.10060927867889 BenchMark 3 average:0.10188813209534 BenchMark 4 average:0.097803926467896 BenchMark 5 average:0.10043952465057HTMLベタ書きが最速なのは当然として、それ以外はあまり差がつきませんでしたね。
BenchMark 1 average:0.10389432907104 BenchMark 2 average:0.50043830871582ピリオドよりもコンマでの連結のほうが速くなると思ったのですが…。
BenchMark 1 average:0.020783019065857 BenchMark 2 average:0.034758615493774速度では圧倒的に「\n」の方が速いですが、
BenchMark 1 average:0.0046348333358765 BenchMark 2 average:0.01211142539978 BenchMark 3 average:0.012383699417114変数と比べて配列は3倍くらい遅いですね。
BenchMark 1 average:0.2620055437088 BenchMark 2 average:0.26266303062439 BenchMark 3 average:0.26184134483337こんな感じでした。
BenchMark 1 average:0.0028216361999512 BenchMark 2 average:0.0024353981018066と、後者のほうが速いです。
BenchMark 1 average:0.11058385372162 BenchMark 2 average:0.11761968135834 BenchMark 3 average:0.11095626354218ローカル変数よりメンバ変数が遅いのはともかくとして、比較するとstaticの方が速いですね。
BenchMark 1 average:0.58168365955353 BenchMark 2 average:0.56918079853058サンプルコード 実行結果
BenchMark 1 average:0.58172357082367 BenchMark 2 average:0.58285653591156今回はここまでです。
BenchMark 1 average:0.014285373687744 BenchMark 2 average:0.013172221183777とまあ、わずかばかり後者のほうが速かったりもします。
FLAG1 FLAG1 FLAG2 FLAG2いかがでしょうか。
BenchMark 1 average:0.010251259803772 BenchMark 2 average:0.0099292039871216サンプルコード 実行結果
BenchMark 1 average:0.10526418685913 BenchMark 2 average:0.10484325885773このような結果になりました。
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9いかがでしょうか。
BenchMark 1 average:0.10385200977325 BenchMark 2 average:0.10636031627655自分だけが見るコードでしたら少々トリッキーなこんな書き方もアリではないでしょうか。
array(5) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[4]=>
int(4)
}
array(5) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[4]=>
int(4)
}
速度調査もしてみますBenchMark 1 average:1.6927280902863 BenchMark 2 average:1.0643670082092速度的にも後者のほうが良いですね。
BenchMark 1 average:0.084321331977844 BenchMark 2 average:0.034408354759216速度も問題ありませんね。
NULL : NULL
"" : NULL
"a" : NULL
0 : int(0)
1 : int(1)
+1 : int(1)
-1 : int(-1)
0x0A : int(10)
012 : int(10)
0.1 : int(0)
1e3 : int(1000)
1e-3 : int(0)
array("") : NULL
array("a") : NULL
array(array("a")) : NULL
TRUE : NULL
FALSE : NULL
object : NULL
fopen : NULL
成功です。以降、数値のチェックをする際はこの関数を使って入力チェックを行っていきます。
NULL : array(0) {
}
"" : array(0) {
}
"a" : array(0) {
}
0 : array(0) {
}
1 : array(0) {
}
+1 : array(0) {
}
-1 : array(0) {
}
0x0A : array(0) {
}
012 : array(0) {
}
0.1 : array(0) {
}
1e3 : array(0) {
}
1e-3 : array(0) {
}
array("") : array(0) {
}
array("a") : array(1) {
[0]=>
string(1) "a"
}
array(array("a")) : array(1) {
[0]=>
array(1) {
[0]=>
string(1) "a"
}
}
TRUE : array(0) {
}
FALSE : array(0) {
}
object : array(0) {
}
fopen : array(0) {
}
ちなみに、実際に使用するときは以下のように判別して使用します。
NULL : string(0) ""
"" : string(0) ""
"a" : string(1) "a"
0 : int(0)
1 : int(1)
+1 : int(1)
-1 : int(-1)
0x0A : int(10)
012 : int(10)
0.1 : float(0.1)
1e3 : float(1000)
1e-3 : float(0.001)
array("") : string(0) ""
array("a") : string(0) ""
array(array("a")) : string(0) ""
TRUE : bool(true)
FALSE : bool(false)
object : string(0) ""
fopen : string(0) ""
array(19) {
["NULL"]=>
NULL
[""""]=>
string(0) ""
[""a""]=>
string(1) "a"
[0]=>
int(0)
[1]=>
int(1)
["+1"]=>
int(1)
[-1]=>
int(-1)
["0x0A"]=>
int(10)
["012"]=>
int(10)
["0.1"]=>
float(0.1)
["1e3"]=>
float(1000)
["1e-3"]=>
float(0.001)
["array("")"]=>
array(0) {
}
["array("a")"]=>
array(1) {
[0]=>
string(1) "a"
}
["array(array("a"))"]=>
array(1) {
[0]=>
array(1) {
[0]=>
string(1) "a"
}
}
["TRUE"]=>
bool(true)
["FALSE"]=>
bool(false)
["object"]=>
object(stdClass)#2 (0) {
}
["fopen"]=>
resource(9) of type (stream)
}
これでテスト時のパターン作成を行う必要がなくなりました。BenchMark 1 average:1.0819767475128 BenchMark 2 average:1.1022774219513変数ありの場合
BenchMark 1 average:1.1036427974701 BenchMark 2 average:1.1097546815872ダブルクォーテーションでは意図しない変数展開が起きてしまう場合も皆無ではありませんので
BenchMark 1 average:0.87322912216187 BenchMark 2 average:0.88909468650818と、このようにコードの実行速度の比較ができます。
pear channel-discover pear.phpdoc.org
pear install phpdoc/phpDocumentor-alpha
@echo off doskey ls=dir/w $* doskey cat=type $* doskey rm=del $* cd Documents\Xampp\htdocs
git config --global user.name 'your name' git config --global user.email you@example.com
git config --global alias.co checkout git config --global alias.ci commit git config --global alias.st status git config --global alias.last 'log -1 HEAD'