Posted at

パーフェクトPHP: 2章メモ

More than 5 years have passed since last update.


isset()の使い方

$var  = 1;

var_dump(isset($var));
var_dump(isset($var1));


可変変数

ある変数に格納された文字列を別の変数の識別子としてみなして、その識別子の変数にアクセスする


sample.php

$var = 1;

$var_name = 'var';
echo $$var_name; // $var_nameの部分が先に評価されてvarが返されて、$varが評価されて1が返される
echo $'var'; //試しに返ってくる値をそのまま入れてみた

PHP Parse error:  syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting T_VARIABLE or '$' in /var/www/html/sample.php on line 5

$var_nameで帰ってくるのは'var'ではなくてvarだから、$varが正しいみたい。

そしたら元々と一緒か。

ちなみにこのエラーは通常はダブルコーテーションとかの使い方を間違っているときにでるみたい。

T_STRINGの『T_』は何を意味する文字列ですか? - Yahoo!知恵袋

phpにおけるT_STRINGとは、「文字列トークン」という意味になります。

TはToken(トークン)の略ではないでしょうか?
http://www.php.net/manual/ja/tokens.php

おそらく、エラーの時にそういったメッセージが出てくると思います。
例えば、Parse error: syntax error, unexpected T_STRING in ... というエラーであれば、
記述しているphpの書き方が間違っていて、本来別の文字がくるはずのところに文字列定義が来てしまっているので、エラーですという意味になります。たいていこういう場合は、直前直後の行が間違っていることが多いです。

なるほど。$の後だから本来T_VARIABLE(今回のケースだとvar)が来るべきところで、

閉じてない引用符の組があったからエラーだよ、ということみたい。


グローバルスコープ

PHPブロックの中はグローバルスコープとされて、別のPHPブロックや別ファイルで定義された変数はグローバルスコープで使われる。


sample.php

<?php

$array = array(1,2,3.4.5);

foreach($array as $i){
echo $i,PHP_EOL;
}

echo $i;


PHP Parse error:  syntax error, unexpected T_DNUMBER, expecting ')' in /var/www/html/sample.php on line 2

原因、3.4.5と謎の表記を入れていた。。

T_DNUMBERはDouble型のNumberが出て来て")”がないと行けないのによくわからないのが入っていた、という意味。


ローカルスコープ

関数やクラスのメソッド内のスコープ。

そもそもクラスの意味がよくわからなくなってる。なんだっけ?

jsの勉強してたときにあったのが、functionの中で変数定義するとローカルでしか見えないからバグがすくないよ、

とか書いてあった気がする。


sample3.php

<?php

$var1 = "foo";
$global_var = "global variable";

function some_function(){
global $global_var;
$var1 = 1;// this $var1 is local variable, and doensn't change global variable with same name
$var2 = 2;
echo $global_var;
}

echo $var1;
some_function();


globalキーワードでローカル変数の呼び出しは可能だけど、

途中で変わってしまっていたらその関数呼び出し時点の値が参照される。

あまり使わないほうが安全。


スーパーグローバル変数

$GLOBALS => 全てのグローバル変数への参照をもつ連想配列

$global_test = 1;

echo $global_test,PHP_EOL;
echo $GLOBALS['global_test'],PHP_EOL;

globalキーワードと同様思わぬ改変によるバグの原因になるのでできるだけ使わない。

$_SERVER =>Webサーバによって生成される値や、Webブラウザがアクセス地にHTTPリクエストヘッダに指定した値など

[vagrant@vagrant-centos65 html]$ php sample6.php 

array(31) {
["HOSTNAME"]=>
string(30) "vagrant-centos65.vagrantup.com"
["TERM"]=>
string(14) "xterm-256color"
["SHELL"]=>
string(9) "/bin/bash"
["HISTSIZE"]=>
string(4) "1000"
["SSH_CLIENT"]=>
string(17) "10.0.2.2 56305 22"
["OLDPWD"]=>
string(13) "/home/vagrant"
["SSH_TTY"]=>
string(10) "/dev/pts/1"
["USER"]=>
string(7) "vagrant"
["LS_COLORS"]=>
string(1538) "rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lz=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.bz=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.rar=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:"
["MAIL"]=>
string(23) "/var/spool/mail/vagrant"
["PATH"]=>
string(78) "/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin"
["PWD"]=>
string(13) "/var/www/html"
["LANG"]=>
string(11) "en_US.UTF-8"
["HISTCONTROL"]=>
string(10) "ignoredups"
["SHLVL"]=>
string(1) "1"
["HOME"]=>
string(13) "/home/vagrant"
["LOGNAME"]=>
string(7) "vagrant"
["CVS_RSH"]=>
string(3) "ssh"
["SSH_CONNECTION"]=>
string(27) "10.0.2.2 56305 10.0.2.15 22"
["LC_CTYPE"]=>
string(5) "UTF-8"
["LESSOPEN"]=>
string(24) "|/usr/bin/lesspipe.sh %s"
["G_BROKEN_FILENAMES"]=>
string(1) "1"
["_"]=>
string(12) "/usr/bin/php"
["PHP_SELF"]=>
string(11) "sample6.php"
["SCRIPT_NAME"]=>
string(11) "sample6.php"
["SCRIPT_FILENAME"]=>
string(11) "sample6.php"
["PATH_TRANSLATED"]=>
string(11) "sample6.php"
["DOCUMENT_ROOT"]=>
string(0) ""
["REQUEST_TIME"]=>
int(1390027995)
["argv"]=>
array(1) {
[0]=>
string(11) "sample6.php"
}
["argc"]=>
int(1)
}