fc2ブログ

奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

任意のPHPファイルをサーバー上をアップロードする際のセキュリティ上の懸念点

追記(普通は末尾に書くんでしょうけど)

以下の質問ですが、リンク先のPHPプロの方でも打ち切らせて頂いたので、
こちらでも、打ち切らせていただきます。
ご意見頂いた方々、どうもありがとうございました。

結論だけ書いておきますと、「サーバーに任意のPHPファイルをアップロード出来る」というのは、
やはり「危ない」ということで、Webサービスとしての展開は止めようと思います。
やるとしたら、クライアント側で解析してサーバー側では結果だけ表示とかですかね。
これはこれで、別の問題がありそうですけど。

以上です。

---------------------------------------------------------------------------------------------

今回は、いつもと違う感じの記事でして「質問」です。
実は、ココ http://www.phppro.jp/qa/4385 とか、
色々な所で同じ質問をさせて頂いてたりしてまして、まぁ「マルチポスト」なんでしょうけど、
僕の場合、そもそも質問をしても返答が無いケースも多く、それでこうする事にしました。
きちんと「管理」はしますので、教えていただければ幸いです。

以下が、質問の本文です。
PHP、セキュリティ、Webサービスに詳しい方、是非ともご意見を頂ければ幸いです。
コメント欄やツイッターなどでも構いませんので。

---------------------------------------------------------------------------------------------

現在、こちら http://d.hatena.ne.jp/gallu/20140812/p1 の記事などを見まして、
「発受注者双方にとって、システムの質を計る為の参考の一つ」となる為の、
PHPのソースコード診断ツールを作っています。
Webサービスでの提供を検討しています。

そして、検討を始めて思ったのですが、
PHPのソースコードを診断するということは、
PHPのソースコードを解析する必要がありまして、
そして、解析する為には、
PHPのソースコードが書かれているファイルの内容を取得する必要があると思いました。
そして、Webサービスとして考えますと、
Webサーバー上にPHPファイルをアップロードしてファイルの内容を取得する(クライアント側で出来なくもないでしょうが、出来ればサーバー側でしたいです)必要があると思ったのですが、
そうすると、「任意」のPHPファイルがアップロードされるケースがあります。
ファイルの内容を取得する(file_get_contentsなど)なら、基本的には問題ないと思っていますが、
PHPファイルが読み込まれる(requireなど)だと、
ソースコードの内容次第ではセキュリティ的に悪い事が出来ると思いました。
あるいは、ファイルの内容を取得するだけでも、
「一時的」には、PHPファイルをサーバーに上げる必要があるので、
診断解析するプログラム上では問題無くても、
シェルコマンドインジェクションで、外部からアップロードされた任意のPHPファイルを実行されれば同じだと思いました。

以下で、質問をまとめさせて頂きます。

Q1.ファイルの内容を取得(file_get_contentsなど)する方法なら、セキュリティの問題は発生しないと思いますが、いかがでしょうか?

Q2.上記のシェルコマンドインジェクションについては、「サーバー内の全PHPファイルでジェルコマンドインジェクションの恐れがない」事を確認すれば良いと思っていますが、
いかがでしょうか?

Q3.ディレクトリトラバーサルと上記シェルコマンドインジェクションを除き、他にセキュリティ面での懸念はどういったものが考えられますでしょうか?

質問に回答するにあたり他に必要な情報がありましたら、その旨を回答していただければと思います。

それでは、どうぞよろしくお願い致します。

---------------------------------------------------------------------------------------------

スポンサーサイト



テーマ:日記 - ジャンル:日記

  1. 2014/08/24(日) 14:06:04|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0

リファクタリング手法その1

さて、たまには技術系の記事でも。

PHPは、関数の引数を可変にすることが出来るのを利用した手法です。
まず、以下の様なコードがありました。

-----------------------------------------------------------------------------------------

<?php

function test($val)
{
return mb_strlen($val);
}

-----------------------------------------------------------------------------------------

このコードに対して、「任意の文字コードを指定したい」という要望があった場合にどうするか。
そして、このコードが「100箇所」で呼ばれていたら?
また、100箇所全てではなく、一部の呼び出し箇所でだけ文字コードを指定したかったら?

他にも方法がありそうですけど、私が導き出したのは以下の手法でした。

-----------------------------------------------------------------------------------------

<?php

function test($val, $enc = NULL)
{
if (NULL === $enc)
{
return mb_strlen($val);
}
else
{
return mb_strlen($val, $enc);
}
}

-----------------------------------------------------------------------------------------

これで、呼び出し側が「$len = test($val);」とか「$len = test($val, 'UTF-8');」とかになっていても、
どちらでも問題なし。
あと、mysqliのfetch_arrayみたく引数に定数名を指定する場合は、
呼び出し側の引数を「定数名と同じ文字列」にして、

$mysqli_resultオブジェクト->fetch_array(constant($引数で渡されてきた定数名の文字列));

とかしたりもあります。

他の言語(例えばJava)なら、オーバーロードという言語仕様を用いれば良いんですけど、
PHPは出来ない(5.4.8で確認済み)ので、じゃあこういう方法になるかなぁと。

テーマ:日記 - ジャンル:日記

  1. 2013/04/06(土) 20:27:00|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0

foreachの挙動

滝打ち1日目。

う~ん、こいつはビックリだ。
いや、以下の記事のプログラムを、動かしてみて思ったんですけどね。

これなぁ…
http://d.hatena.ne.jp/gallu/20130201/p1

foraechって、思想として、
「配列の"全要素"を出力する」っていうのがあると思ってまして(どっかのページにも書いてたけど)、
「全要素」じゃない場合は、forでインデックスの範囲を指定しろって事なんじゃないかなぁと。
だから、foreachの中でunsetしようが何しようが、
「とにかく全要素出力するんだ!」とw
で、「配列をcopy」しているのではという仮説を検証する為に、以下の様なプログラムを。
PHPのVerは5.4.8。

-----------------------------------------------------------------------------------------
<?php

function diff_microtime($start, $end)
{
list($start_m, $start_t) = explode(' ', $start);
list($end_m, $end_t) = explode(' ', $end);
return ((float)$end_t + (float)$end_m) - ((float)$start_t + (float)$start_m);
}

var_dump(memory_get_usage(true));
var_dump(memory_get_peak_usage(true));

$awk = array();

for ($i = 0; $i < 100000; $i++)
{
$awk[] = $i + 1;
}

var_dump(memory_get_usage(true));
var_dump(memory_get_peak_usage(true));

$start = microtime();

foreach ($awk as $k => $v)
{
if (9 >= $k)
{
var_dump(memory_get_usage(true));
var_dump(memory_get_peak_usage(true));
}
}

$end = microtime();

var_dump(memory_get_usage(true));
var_dump(memory_get_peak_usage(true));

echo diff_microtime($start, $end) . "\n";
-----------------------------------------------------------------------------------------

実行結果。

$ php foreach_test.php
int(232408)
int(262144)
int(244544)
int(262144)
int(14881480)
int(15204352)
int(14883776)
int(15204352)
int(14881904)
int(15204352)
int(14884160)
int(15204352)
int(14881904)
int(15204352)
int(14884160)
int(15204352)
int(14881904)
int(15204352)
int(14884160)
int(15204352)
int(14881904)
int(15204352)
int(14884160)
int(15204352)
int(14881904)
int(15204352)
int(14884160)
int(15204352)
int(14881904)
int(15204352)
int(14884160)
int(15204352)
int(14881904)
int(15204352)
int(14884160)
int(15204352)
int(14881904)
int(15204352)
int(14884160)
int(15204352)
int(14881904)
int(15204352)
int(14884160)
int(15204352)
int(14881904)
int(15204352)
int(14884160)
int(15204352)
int(14882088)
int(15204352)
int(14884344)
int(15204352)
0.016510009765625
$

あれ~、foreachの実行を境にして、別にメモリが増えてはいないですね。
なぜだ・・・なぜだ・・・ちょっと分かりませんねぇ。
もう少し検証が必要そうですけど、それはまた後日に。

最後に、少し話変わりますけど、
上記の挙動なんかも考えると、繰り返し文(for、foreach、while)の使い分けについて、
規約を定めた方が良いんじゃないかなぁと、思い始めてきました。
数値添字配列なのか連想配列なのかによっても、変わってくると思いますし。
自分が知ってるのだと、pg_fetch_array()を使うと、
配列の中に数値添字と文字列添字のキーを両方持つので、メモリ食うんじゃね?とか。
あと、色々なページを見て検証した時に、
forよりforeachの方が(メモリはともかくとして)速度が速いというのも確かあったよなぁとか。

とまぁ、そんな事を一度整理してみたい所だなぁと、そう思ったわけです。

テーマ:日記 - ジャンル:日記

  1. 2013/02/03(日) 18:45:29|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0

文字列連結、どれが最適?

えっと、先日某所より
「ループ内では、「.=」で文字列連結しないでarrayの要素に一つずつ値を突っ込んで、ループ抜けた後にimpludeせよ」
的なお話をいただいたのですが、
「確かに速いかもしれないけど、メモリ的にはどうよ?」とも思いましたので、
これはちょっと検証してみましょうという記事です。
検証に使ったPHPのバージョンは、5.4.8です。

じゃあ、まずは「.=」での連結から。

-----------------------------------------------------------------------------------------

<?php

function diff_microtime($start, $end)
{
list($start_m, $start_t) = explode(' ', $start);
list($end_m, $end_t) = explode(' ', $end);
return ((float)$end_t + (float)$end_m) - ((float)$start_t + (float)$start_m);
}

var_dump(memory_get_usage());
var_dump(memory_get_usage(true));
var_dump(memory_get_peak_usage());
var_dump(memory_get_peak_usage(true));

$start = microtime();

$str = '';
for ($i = 0; $i < 100000; $i++)
{
$str .= 'a';
}

$end = microtime();

echo diff_microtime($start, $end) . "\n";

var_dump(memory_get_usage());
var_dump(memory_get_usage(true));
var_dump(memory_get_peak_usage());
var_dump(memory_get_peak_usage(true));

-----------------------------------------------------------------------------------------

実行結果は以下の通り。

int(228664)
int(262144)
int(231608)
int(262144)
0.016595125198364
int(329440)
int(524288)
int(332456)
int(524288)

次に、「= 変数 . 連結したい文字列」の連結。
さっきと同じソースの箇所は省略しています。

-----------------------------------------------------------------------------------------

~略~

$str = '';
for ($i = 0; $i < 100000; $i++)
{
$str = $str . 'a';
}

~略~

-----------------------------------------------------------------------------------------

実行結果は、

int(228712)
int(262144)
int(231608)
int(262144)
0.68254494667053
int(329480)
int(786432)
int(465864)
int(786432)

う~ん、明らかに遅いですねぇ。ということで却下かと。
で、ちょっと気になったのは、まぁ本題と関係ないんですけど、
ループを抜けた後の「memory_get_usage(true)」と「memory_get_peak_usage()」の値。
まず前者については、memory_get_usage()の値はほぼ同じなのに、
なんで、こんなに差異が生じてしまっているのかと。
後者は、memory_get_peak_usage(true)の値がほぼ同じなのに、
なんで、こんなに差異が・・・以下略。
う~ん、分からないですねぇ。マニュアルにはemalloc()と書いてあるので、
C言語の知識が必要かもしれませんね。
まぁ、勉強ですね。
最近は、師匠も教えてくれなくなってきましたしねぇw

次は、こんな形。

-----------------------------------------------------------------------------------------

~略~

$str = '';
for ($i = 0; $i < 100000; $i++)
{
$str = "{$str}a";
}

~略~

-----------------------------------------------------------------------------------------

実行結果は、

int(228720)
int(262144)
int(231608)
int(262144)
0.53206992149353
int(329488)
int(786432)
int(565888)
int(786432)

これまた遅いですね。
次は、array_pushを使ったケース。

-----------------------------------------------------------------------------------------

~略~

$arr = array();
for ($i = 0; $i < 100000; $i++)
{
array_push($arr, 'a');
}

$str = implode('', $arr);

~略~

-----------------------------------------------------------------------------------------

実行結果。

int(229216)
int(262144)
int(231608)
int(262144)
0.071195125579834
int(18178848)
int(18612224)
int(18183968)
int(18612224)

うん、確かに遅くはないですけど、やっぱりメモリが~ですね。
最後に、array_pushを使わない配列への要素の追加のケース。

-----------------------------------------------------------------------------------------

~略~

$arr = array();
for ($i = 0; $i < 100000; $i++)
{
$arr[] = 'a';
}

$str = implode('', $arr);

~略~

-----------------------------------------------------------------------------------------

実行結果。

int(229088)
int(262144)
int(231608)
int(262144)
0.1010959148407
int(18179280)
int(18612224)
int(18181992)
int(18612224)

array_pushを使った時と、殆ど変わらないですね。

ということで結論。
「.=」での文字列連結が、速度的にもメモリ的にも一番良いと思います。
まぁ、「unsetすれば配列使っても問題ないだろ」ってツッコミに対しては、
「unsetを書き忘れたら?」って反論で終わりだと思いますしね。
書かなくて問題ないなら、書かない方が良いでしょ?

あと、最初に書いた発言は、多分PHPのバージョンが古かったか、
検証方法が上記とは違うやり方だった(と言われても、どういうやり方よって話ですけど)か、
単純に検証が甘かったかのいずれかじゃないですかね。
個人的予想では、検証が甘かったに一票を投じますけど B-p

ああ、あと文字列連結の実装方法は、上記以外にもあるのかなぁっていう疑問も少しありますね。
まぁ、もし見つけたら、また検証してみたいと思います。

テーマ:日記 - ジャンル:日記

  1. 2012/11/25(日) 17:09:22|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0

値渡しと参照渡しの速度比較

今回の内容は、先月書いた値渡しで値を変えると処理速度が激遅になる時があるの続きなんですけど、
それについて、先日とある勉強会で話をして来ました。
で今回は、話をした内容をテキストにしたもの(自己紹介とかは除外してるけど)を書きたいと思います。
赤文字になっている箇所は、この記事の後半で補足しています。
また、横線の区切りはPPTのスライドのページ区切りと同一です。

-------------------------------------------------------------------------------------------------------
値渡しと参照渡しの比較
by kitoku
-------------------------------------------------------------------------------------------------------
[本題]
軽くブログ(前回の記事)の内容をおさらい
・値渡し後に引数の値を変えると、呼び出し元の値を維持する為に値のコピーが行われ時間がかかる
・よって、引数の値を変える場合には、参照渡しかオブジェクト指向のカプセル化(セッター)を使うと良い
-------------------------------------------------------------------------------------------------------
[引数のデータ型は関係あるか?]
・boolean、float、int、NULL、objectは、参照渡しの方が速いが気になるレベルの差でもないと思う*1
・resourceは差が出なかった。値の変更は、fopenで違うファイルを読むとしたのが原因か?
・stringと配列(数値か連想問わず)は、length(文字数や要素数)が多いほど、参照渡しの方が有利になる
-------------------------------------------------------------------------------------------------------
[文字列と配列が顕著なのは何故?]
・値を格納するメモリ領域のサイズが可変だからっぽい
・例えばintだと、値が0でもint_maxでも確保するメモリ領域のサイズは変わらないが、
文字列(文字の配列(PHPもC言語と同じっぽい))と配列(数値か連想問わず)だけは、文字数や要素数によって、サイズが変わる
・intなどでも時間差は発生するが、メモリ領域のサイズが変わらないので、微々たる差に留まる
←よって、文字列と配列の時に特に注意
-------------------------------------------------------------------------------------------------------
[処理の何処で時間がかかるのか?]
・引数の値を変える「瞬間」(コピーオンライトという仕組み)
・値渡しだと、関数の呼び出し元の値を保持する為、値のコピーが行われるが、コピーが行われるタイミングは、引数を渡した瞬間では「ない」
・だから値渡しでも、その引数の値を操作しなければ、時間はかからない
・コピーにかかる時間は、メモリ領域のサイズの大きさに比例する(だから文字列と配列が注意)
-------------------------------------------------------------------------------------------------------
[サンプルプログラムその1]
*2
function 関数名($引数A, $値A) {
  $引数A = $値A;←このタイミングで値のコピーが行われるので、この行の処理に時間がかかる
  return $引数A;
}

function 関数名($引数A, $値A) {
  $変数A = $引数A;←この場合は、値を変更していないので、値のコピーは行われず、時間もかからない
  return $変数A;
}

function 関数名($引数A, $値A) {
  $変数A = $引数A;
  $変数A = $値A;←これでも引数Aの値のコピーが行われる。変数Aと引数Aで同じメモリ領域を見てる?
  return $変数A;
}
-------------------------------------------------------------------------------------------------------
[サンプルプログラムその2]
*3
class クラス名 {
  public function メソッド名($引数A, $値A) {
    $引数A = $値A;←メソッドにしても所詮は値渡しされた引数の中身を変えているので結果は変わらない
    return $引数A;
  }
}

$変数A = 値B;
$変数B = new クラス名();
$変数A = 変数B->メソッド名($変数A, 値C);
-------------------------------------------------------------------------------------------------------
[サンプルプログラムその3]
class クラス名 {
  public function コンストラクタ() { $this->init(); }
  public function init() { $this->set_変数A(null); }
  public function set_変数A($変数B) { $this->変数A = $変数B; }
  public function get_変数A() { return $this->変数A; }
  public function メソッド名($値A) { $this->変数A = $値A; }
  private $変数A;
}

$変数C = new クラス名();
$変数C->set_変数A(値B);
$変数C->メソッド名(値C);
// 値を取得したければ「$変数C->get_変数A()」

値渡ししていても、その引数の中身を操作していないので問題ない
-------------------------------------------------------------------------------------------------------
で、終わりのはずが・・・
-------------------------------------------------------------------------------------------------------
[前回のブログ記事のはてブにこんなのが]
理屈では知っていても、結果を見ると改めて驚かされますね。ただ速度を考慮しないのであれば、参照渡しとか破壊系のメソッドとかは使いたくないしなぁ。
←破壊系のメソッドってなぁに?
-------------------------------------------------------------------------------------------------------
[破壊系のメソッド]
・オブジェクトの内部状態(値)を変えてしまうメソッド
・Rubyに多いみたい
・例えば、「$str = 'a';」の時、「$str->小文字を大文字に変えるメソッド();」を実行し、「戻り値がない」のに、$strが'A'になる様なメソッド
・つまり、自分で自分のクラスのメソッドを呼んでるのに、自分の内部状態を変えてしまうメソッド(ミュータブル的とも言う)
-------------------------------------------------------------------------------------------------------
[非破壊系のメソッド]
・オブジェクトの内部状態(値)を変えないメソッド
・さっきと逆で、内部状態を変えたい時には、戻り値が必要
・例えば、「$str = 'a';」の時、「$str = $str->小文字を大文字に変えるメソッド();」を実行すると、$strが'A'になる様なメソッド
・つまり、自分で自分のクラスのメソッドを呼ぶだけでは、自分の内部状態は変わらないメソッド(イミュータブル的とも言う)
-------------------------------------------------------------------------------------------------------
[で・・・]
・破壊的(ミュータブル的)と参照渡しとオブジェクト指向
・非破壊的(イミュータブル的)と値渡しと非オブジェクト指向
・これらって似てないか?
・前者はオブジェクトの状態が「変わる」が、後者は「変わらない」って角度で見たときに
-------------------------------------------------------------------------------------------------------
[イミュータブルなクラスのサンプル]
final class クラス名 {
  public function コンストラクタ($変数A) { $this->変数B = $変数Aをディープコピーする; }
  public function get_変数B() { return $変数Bをディープコピーする; }
  public function メソッド名($値A) { new 自分のクラス名($値A); }
  private final(PHPは変数にfinal書けないけど) $変数B;
}

$変数C = new クラス名(値B);
$変数C->メソッド名(値C);
// 値を取得したければ「$変数C->get_変数A()」

値渡しした引数の中身を変えていない(というかfinalだと変えれない)ので、速度は低下しない
-------------------------------------------------------------------------------------------------------
[ミュータブルとイミュータブルの比較]
・イミュータブル

メリット:
1.変数の値(オブジェクトの状態)の変化に気を使う必要がないので使いやすい

デメリット:
1.(値渡しは)複数の戻り値を返しにくい*4
2.(値渡しは)値のコピーに処理時間がかかる
3.(イミュータブルは)不変なので、値を変えたい時には新たにインスタンスを生成しなければならない(コスト的にどうか)
4.(イミュータブルは)finalなので継承が出来ない。よって拡張性に欠ける
-------------------------------------------------------------------------------------------------------
[ミュータブルとイミュータブルの比較]
・ミュータブル

メリット:
1.(参照渡しは)複数の戻り値を返しやすい*5
2.引数は「(多分)メモリのアドレスを参照しているだけなので実態をコピーする必要がなく」処理時間がかからない
3.値を変えたい時に、インスタンスを生成する必要がない
4.finalじゃないので、継承したりして拡張出来る

デメリット:
1.引数の値(オブジェクトの状態)の変化に気を使う必要があるので使いにくい

とはいえデメリットについて。
値を変えたい変数は引数で渡さずに、必ずセッター経由で値を変える様にすると、
セッター内でデバッグすれば(どのファイルのどの行から呼ばれたかを調べる)きっちり監視できる
-------------------------------------------------------------------------------------------------------
[ミュータブルの方が良い別の理由]
ソフトウェアは、機能追加や改修により「成長」していくもの(アジャイルが典型的)
保守性の高さがウリと思う、オブジェクト指向(つまりミュータブル)は、そういった意味でソフトウェア開発に合っていると考える
だから、ミュータブルの方が良いと思う
といっても、イミュータブルの方が良い時がある可能性も否定はしない(どういう時かは不明)
-------------------------------------------------------------------------------------------------------
[結論]
ミュータブルの方が扱いが難しいかもしれないが、頑張って勉強して使いこなそう!
イミュータブルも、使える局面があった時に使える様に勉強はしておこう!
今回の話が、皆さんのより良いソフトウェア開発ライフの一助になれば幸いです
-------------------------------------------------------------------------------------------------------

ここからは、上記本文中の「*」についての補足です。

*1→秒数の差は、値渡しか参照渡しをする以外は処理に差異がない関数を1000000回呼び出して0.1秒前後でした
*2→値渡しをしている前提です
*3→*2と同じ
*4→関数内で変更した変数を、1つずつ配列に追加していけば出来るが、要素の何番目にどの変数が入っているかを意識しないといけないので、微妙だと思います
*5→複数の戻り値ではなく、関数内で複数の変数の値を変更して呼び出し元に反映できるという意味です

また、話した時に頂いた質問についても、以下で触れてみます。
ちなみに、他にも質問がありましたが忘れました(苦笑)
終わった後にすぐまとめたほうが良いですねぇ。

Q.ミュータブルにすると何がオイシイのか?

A.アジャイルとの相性が良い辺り。また、イミュータブルだと本文の通りオイシクない時があるので、相対的にミュータブルがオイシくなると思います

Q.objectはクラス構成(メンバーの数などクラスの大きさ)によって速度が変わるのでは?

A.構成を変えて試してはいないので分からない。あくまでも今回は、同じ構成で値渡しと参照渡しをした時の速度比較した時の話です

最後に、ウチ自身の継続課題などを。

ミュータブルだと、マルチスレッドの時に値の書き換えを心配しないといけないのでは

Webだと、リクエスト(スレッド)ごとにインスタンスを生成すれば、
値を共有することはない?

シングルトンは?

シングルトンは、単一のインスタンスをずっと変えない性質なのでイミュータブルと少し似ている?
であれば、少なくとも積極的に使う必要はないと思う。
疑似グローバルという側面もあるので。

PHPの内部的には一体どうなっているのか?

PHPのデータ構造を読む。
といってもこの辺は、C言語の知識の応用で事足りる?

とりあえず今回はこんな所です。

<追記>
えっと、PHPの関数では、参照渡しよりもreturnしたほうが速い!?というページを見つけました。
で、ウチも検証してみましたが、確かに2倍ぐらい差が出ます。
ただ、今回の記事と違って、値渡しを「していない(正確にはする必要がない)」ので、
そもそも引数が不要な場合(引数の値を関数内で使う必要がない場合)には、
参照渡しよりreturnで戻り値を返した方が良いよって事だと思います。
また、多分突っ込みで、
「この関数が終わった後に、他のクラスで使いたいから参照じゃないとダメなんだ」っていうのがあるかもしれませんが、
それなら、関数が終わった後にセッターに代入しておけば良いのではと思います。
といってもまあ、これはワリと本気で、
クラス構成(こっちは上手く組めば無い?)や処理の流れ(特にコッチ)によっては、
参照渡しにせざるを得ないケースもあるかもしれません。
まぁ、なかなか難しい所だと思います。
以上です。

テーマ:日記 - ジャンル:日記

  1. 2012/02/19(日) 21:25:48|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
次のページ