2016年12月27日火曜日

MySQLとPHP/基本のメモ3

前回まではとりあえず書いてみたっていうだけでした。
今回は、ここのメソッドや変数について確認します。


メモ

カウンタ変数に色をついた名前を
文法関係や言語に関係なく、なかなか治らない自分の悪癖
同時にカウンタ変数にアクセスされる場合や、
後で放置されたカウント変数にアクセスしちゃう場合があり得るんですね。
エラーになってくれた方が、論理エラーがなくなって助かりますが。。。

ローカル変数をグローバルに
用途がよくわからないのですが、、、できるようです。
global $変数名;
宣言時にglobal とつけてやる。

クロージャ(無名関数)
最近全然JS書いてないけど、スコープを作るために
無名関数書くっていうのもありますよね。

クラス内の定数
const 定数名 = 値;
グローバルな定数とは書き方が違う。
しかも$マークは付けない。
自クラス内で使う場合は、self::定数名
Javaでのstaticと同じような扱いか。

PHP 5.3 以降のconst
クラスの定数かどうかに関わりなく、定数宣言にconstが使えるそうです。
同じかと思ったら、下記の違いがありました。
constで定義したクラス外の定数 = 名前空間に属する
defineで定義した定数 = グローバルな定数

変数名と定数名と関数名
1文字目 = _または半角英字
2文字目以降 = _と 半角英数字
大文字・小文字を区別する。
※関数名のみ大文字・小文字を区別しない
※そうは言っても「書いた通りの大文字小文字で呼出せよ」と公式ドキュメントには書いてある。

PHPのfor文は変化式を複数かける
まぁforのスコープの中で増やしている処理がすっきり書けるっていうだけですが、
for ( $i = 0 ; $i < 0 ; $i++ , $countDown-- )
という書き方が可能。カンマ区切りで複数の処理を書くことができます。

PHP は関数のオーバーロードをサポートしていません。
公式ドキュメント
Qiitaの記事で紹介されていますが、
実装でカバーできるようです。

NULLとNULL文字(\0・NUL)は同義ではない
NULL文字(\0)の存在を初めて知りました。
文字列の終端を表すための文字なんですね。
一方NULLは何も参照していないことを表す記号ですね。

100-200回を超える再帰呼び出しはするな
これも公式ドキュメントネタです。
Paizaさんみたいなコードクイズでもない限り、自分は再帰処理を滅多に書きませんが、
メモリがスタックする可能性があることは記憶の片隅に留めたい。

PHPの変数は値を格納する「箱」not label
変数Aに変数Bを代入する場合、変数Bの値をコピーするということになる
$a = 10;
$b = $a;
$b = 20;
最後に$bに20を代入しているけど、$aの値は10のまま

逆に2つの変数を連動したい場合
参照を渡してみる
複数回メソッドを呼び出す際や、スコープをまたいで値を変更してあげたいときに
参照渡しを使う
&アンパサンダをつける。 変数の初期化
$a = 10;
$b =& $a;
$b = 20;
最後に$bに20を代入すると、$aも20となる

変数の初期化
 function doubleUp(&$num) {
   $num *= 2;
 }

 $age = 20;
 doubleUp($age);

doubleUpを呼ぶと、引数に渡した変数が倍に設定される。

アクセス修飾子(再掲)
デフォルトなんだったか忘れる。。。。publicですね。
public, protected, private
privateは自クラスのみアクセス可、子クラスからもアクセス不可。
protectedは自クラスと子クラスからアクセス可。
publicはどこからでもアクセス可
varを使ってプロパティを宣言した場合や、メソッドにアクセス権を明記しない場合は、public扱いです。

UTF8 BOM
BOMとか初めて知った。。。
Byte Order Mark
符号化に関するファイルヘッダーで、これが付いていることにより、 想定外の動作になることがあるらしい。

PDO_DSN
DSNはData Source Nameの略みたいです。
詳しくは公式ドキュメント参照ですが、
mysql:host=xxx;port=xx;dbname=xxx
というようにsql名:key=value;..で組み立てた文字列を使う。

PDO::setAttribute
属性の設定
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
で、エラー時に例外を投げる設定になる。その他は公式参照。

PDO::setAttribute( ATTR_EMULATE_PREPARES, false )
属性の設定
SQLインジェクション対策として、常にfalseにしましょう
で、エラー時に例外を投げる設定になる。その他は公式参照。
また、true担っているとDBでint型のものをStringに変換してしまうとか。。。
Qiita PDOでATTR_EMULATE_PREPARESを適切に設定してないとSQLインジェクションの原因になるかも(MySQL編)
参照:なんでPHPはMySQLからのリザルトがint型のはずなのにstring型になってしまうん?

0 件のコメント:

コメントを投稿