バグリーマート

バグリーマート

プログラミングのことや、楽器のことなど

Amebaでブログを始めよう!
値渡しと参照渡しの違いはわかりますか?

なんとなく理解してなんとなく使っていて、ふと疑問に思ったので、調べてみました。

値渡し・・・値をコピーして渡す。
参照渡し・・・領域ごとを渡す。

どういうことかというと、
値渡しはローカルな感じになる。
参照渡しはグローバルな感じになる。

なんか説明するとめんどくさくなってきたので、やめようと思います。

それではごきげんよう
セッションに値を代入する際になぜか値が「css」となる現象が起こった。
どうしても以下の処理を行うとセッションが「css」と代入された

$_SESSION['test'] = $_GET['test'];

最初からこれならすぐわかってたのだが、zendフレームワークでrequestsって変数にPOSTもGETも突っ込まれる状態でやっていたので、はまったはまった。

「css」、プログラム内の「GET」だいたいわかりますね。

クロスサイトのことですよ、これ。

cssの意味がわからなかったからすごく時間がかかった。
xssと書いてくれてれば、いいのに。

以下のコードに変更して対応


$_SESSION['test'] = $_POST['test'];


正確には_POSTなんかこんなところに書きませんが、こういう感じに変更。
マスターテーブルに性別のテーブルがあったとします。
中身は以下のようなものがはいっています。

id name
---+------
1 男
2 女
3 その他


でプログラム内でこんな処理かきませんか?

// $requests['sex']に1が入っていた場合「男」が表示される
echo $sexPairs[$requests['sex']];

またはこんな処理かきませんか?

if($reqests['sex'] == 1 ){
// 性別が男だった時の処理
}

ここの1は定数にしたいなぁと思って、
SEX_MALE=1とSEX_FEMALE=2を定義したりします。

結果こんな感じの定義になります。

$sexParis = array(
1 =>'男'
2 =>'女'
3 =>'その他'
);

define('SEX_MALE',1);
define('SEX_FEMALE',2);
define('SEX_OTHER',3);


なんかきもち悪くありませんか?
私はなんか気持ち悪いです。

DBとプログラム内で似たようなものがあるとなんか汚く見えます。
でも結構こういったソースが多いと思いますが。

結論はDBで持たずに、プログラム内で両方もつのがよいと思います。
そうすると以下のように定義できますね。


define('SEX_MALE',1);
define('SEX_FEMALE',2);
define('SEX_OTHER',3);

$sexParis = array(
SEX_MALE =>'男'
SEX_FEMALE =>'女'
SEX_OTHER =>'その他'
);


これをモデルとして作ると以下のようになります。

class Default_Model_Sex
{
const SEX_MALE = 1;
const SEX_FEMALE = 2;
const SEX_OTHER = 3;

public static $sexPairs = array(
self::SEX_MALE => '男',
self::SEX_FEMALE => '女',
self::SEX_OTHER => 'その他',
);

/**
* コンストラクタ
*/
public function __construct() {
}
public static function getSexPairs(){
return self::$sexPairs;
}
}