PHP
基本事項
コマンドラインで php ファイルを実行
php test.php
デバッグ用出力
print_r(); // 簡易
var_dump(); // 詳細
Basic Syntax
<?php
ではじめて、?>
で終わる。終わりのタグは、可能であれば省略する。- 命令文の最後には
;
が必ず必要。ただし終了タグの直前においては省略も可能。
// echoのショートハンド
<?php echo 'hello world' ?>.
<?= 'hello world' ?>
// comment1
# comment2
/*
* comment3
*/
Types
概要
- scalar(数学) types
- boolean
- integer
- float(=double)
- string
- compound types
- array
- object
- callable
- iterable
- special types
- resources
- NULL
- pseudo types
- mixed
- number
- callback
- array|object
- void
Type の確認方法
var_dump(123)
タイプと値をコンソール出力するgettype(123)
タイプを文字列として取得する(デバッグ用)is_type(123)
その型かどうかを判定したいときにつかう
var_dump(123); // => int(123)
echo gettype(1); // => integer
if (is_int(1)) {};
if (is_string('a')) {};
boolean
真偽値。case-insensitive である。
if ($action == "show_version") {}
$is_valid = true;
if ($is_valid) {}
echo
boolean を echo (文字列に Cast)すると、true は 1 を出力し、false は何も出力しない。
キャスト
キャストしたいときは(bool)
を使う。他のタイプでも同じだが、殆どの場合で自動キャストされるので、使うことはほぼない。
var_dump((bool) '1');
FALSE として判定されるもの
- FALSE
- 0(integer)
- 0.0(float)
- 空文字列及び"0"(string)
- 長さのない array
- NULL
TRUE として判定されるもの
- 上記以外のすべて(resource と NAN を含む)
Integer
整数。
$a = 1234; // 10進数 正の整数
$a = -123; // 10進数 負の整数
$a = 0123; // 8進数
$a = 0x1A; // 16進数
$a = 0b11111111; // 2進数
float への変換
計算結果が integer の範囲を超える場合は自動的に float が返される。
$large_number = 2147483647;
var_dump($large_number); // int(2147483647)
$large_number = 2147483648;
var_dump($large_number); // float(2147483648)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number); // float(50000000000)
計算結果が小数になる場合も float が返される。なお、round()
は四捨五入、(int)
は 0 に近い方に切り捨てる。
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
int への cast
-
boolean
- true は 1
- false は 0
-
float
- 0 に近い方にまるめられる
-
string
echo (int) "10.5"; // 10
echo (int) "-1.3e3"; // -1300
echo (int) "bob-1.3e3"; // 0
echo (int) "bob3"; // 0
echo (int) "10 Small Pigs"; // 10
echo (int) "10.2 Little Piggies"; // 10
echo (int) "10.0 pigs "; // 10
echo (int) "10.0 pigs "; // 10
Float
float = double = real numbers
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
float へのキャスト
-
string
echo (float) "10.5"; // 10.5
echo (float) "-1.3e3"; // -1300
echo (float) "bob-1.3e3"; // 0
echo (float) "bob3"; // 0
echo (float) "10 Small Pigs"; // 10
echo (float) "10.2 Little Piggies"; // 10.2
echo (float) "10.0 pigs "; // 10(float)
echo (float) "10.0 pigs "; // 10(float)
String
文字列には4種類の記法がある。
- single quoted
- double quoted
- heredoc syntax
- nowdoc syntax
single quoted
- 複数行に渡って書ける
'
を出力する時のみエスケープが必要- 制御文字は使えない
- 変数は展開されない
- 基本的にそのまま文字列として出力される
// 複数行書ける
echo 'You can also have embedded newlines in
strings this way as it is
okay to do';
// 'を出力するには\でエスケープ
echo 'Arnold once said: "I\'ll be back"';
// 下記はただの文字列として出力される
echo '$some_val with \r newline';
double quoted
- 複数行に渡って書ける
\
を使って制御文字を出力できる- 変数は展開される
echo "$some_val with \r newline
and multiline
is ok";
Nowdoc
- single quote の別の書き方。
- 中身は評価されない
'EOT'
の部分をシングルクオートで囲むこと。名前は任意に書き換えて OK。
echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;
Heredoc
- double quote の別の書き方。
- 中身が評価される
EOT
の部分をダブルクオートで囲むか、もしくは囲まないこと。名前は任意に書き換えて OK。
$a = 'John';
$str = <<<EOT
my name is $a \r Doe
EOT;
変数のパース - simple syntax
double quoted 等の中において変数をパースする 方法は、simple と complex の 2 種類がある。simple-syntax では、$
を使う。変数名の区切りをはっきりさせる必要があるときは変数名を{}
で囲む。
echo "my name is $myname. nice to meet you";
echo "my name is ${myname}. nice to meet you";
echo "$people->john drank some $juices[0] juice.".PHP_EOL;
変数のパース - complex syntax
複雑な Expression を書ける方法、という意味で Complex と呼ばれている。{}
を使う。下記のような場合に使用する。
- シングルクオートを使いたい
- 動的に変数名を設定したい
- Object のプロパティ名の区切りを明示したい
echo "This is {$arr['foo']}";
echo "This is ${$great}";
echo "This square is {$square->width}00;
ブラケットによるアクセス
文字列の特定の場所にアクセスしたいとき はブラケット[]
もしくは braces{}
を使う。2 文字以上を操作したいときは、substr()
orsubstr_replace()
を使う。UTF に対応していないので実際は使い物にならない。
'string'[0]; // => 's'
'string'[-2]; // => 'n'
結合
文字列は.
で結合できる。
echo "my name "."is"." android";
String への Cast
(string)
orstrval()
で文字列にキャストできる。echo
やprint
function では自動的にキャストが行われる。
array, object, resources はそのままキャストしても意味がない("Array"などになってしまう)ので、print_r()
やvar_dump()
を使うこと。
- boolean
- true は"1"に、false は""になる
- integer, float
- そのまま文字列になる
- array
- "Array"という文字列になる
- echo などしたいときは
[]
で中の要素を取り出して表示すること
- object
__toString
に実装されている値になる
- resouces
- "Resource id #1"のような文字列になる。 数字の部分は一意のリソースナンバーを指す。
- NULL
- ""になる
なお、php で使うほとんどの値はserialize()
を使うことで string の表現に変換できる。シリアライズ化した値は、unserialize()
でもとに戻すことができる。
Arrays
PHP の Array は、実際は Ordered Map(key-value ペア) である。下記のような用途に使うことができる。
- array
- list(vector)
- hash table
- dictionary
- collection
- stack
- queue
array()
による作成
- キーには integer 又は string を使うことができる
- value にはあらゆる値を格納できる
print_r(array(123, 456));
// => Array ( [0] => 123 [1] => 456 )
print_r(array(
"foo" => "bar",
"bar" => "foo", // trailing commaが使える
));
print_r([ // PHP 5.4以降では[]も使える
"foo" => "bar",
"bar" => "foo",
]);
// => Array ( [foo] => bar [bar] => foo )
- キー名は、次のルールによりキャストされる
- Valid な 10 進数を含む String は integer に
- float は trunc された integer に
- boolean は integer に
- null は""(empty string)に
- なお、array と object は key として使用す ることはできない
- キーを省略すると、Auto Increment な integer が順に振られる。この際、その配列において過去に一度でも使われた数字は、すでに配列から消去されている場合でも、再利用はされない。再利用したい場合は
array_values()
を使って reindex する作業が必要。
$array = array(
"a",
"b",
6 => "c",
"d",
);
/*
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
*/
- 要素へのアクセスは
[]
or{}
をつかう。なお、この 2 つの記法は全く等価である。
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array{42});
var_dump($array["multi"]["dimensional"]["array"]);
[]
による作成・変更
[]
で特定の要素を作成、取得、変更できる- もし
$arr
が存在しなかった場合は作成される(Array 作成の方法としては非推奨) - Key を省略した場合は、Auto Increment な数値が自動で振られる。
$arr[] = 56;
$arr["x"] = 42;
// Array([0] => 56, [x] => 42)
Array に関連した便利なファンクション
-
unset($arr)
,unset($arr[key])
要素又は配列を削除する。reindex は行わない。$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // $arr[13] = 56;
$arr["x"] = 42;
unset($arr[5]); // This removes the element from the array
unset($arr); // This deletes the whole array -
array_values($arr)
reindex した配列を返す -
foreach ($array as $value) {}
-
foreach ($array as $key => $value) {}
-
count($arr)
-
sort($arr)
-
array_diff($arr1, $arr2)
String へのキャスト時の注意
key のタイプによってキャスト時の作法が変わる
// Keyが変数のとき
echo "$array[$i]"; // ""で囲む
// KeyがStringのとき
echo "{$array['test']}"; // complex-syntaxを使う
echo $array['test']; // 又は""の外に出して、`.`でconcatして対応する
Array へのキャスト
-
(array) someval
で Array にキャストできる。 -
int, fload, string, boolean, resource の場合、
array(someVal)
したのと同じことになる。つまり、長さ 1 の配列に、someVal が格納される。print_r((array) 123); // => Array([0]=>123)
-
NULL の場合、長さが 0 の配列になる。
-
object の場合
- プロパティがキー名になる
- private の場合は
\0クラス名\0プロパティ名
になる - protected の場合は
\0*\0プロパティ名
になる \0
は null を表す。なぜこれが必要なのかはよくわからない。
class MyClass
{
public $myPublic;
private $myPrivate;
protected $myProtected;
}
/*
array(3) {
["myPublic"]=> NULL
["\0MyClass\0myPrivate"]=> NULL
["\0*\0myProtected"]=> NULL
}
*/
配列の比較
array_diff($arr1, $arr2)
により、arr2 に存在しない要素を抽出できる。
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);
// => Array([1] => blue)
参照渡しと値渡し
Array の場合、デフォルトは値渡しになる。参照渡しにしたい場合は&
を付与する。
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // arr1は変更されていない
$arr3 = &$arr1;
$arr3[] = 4; // arr1は変更されている
Iterables
PHP 7.1 以降で使える疑似タイプ。下記を受け付ける。foraech することができる。
- array
- Traversable interface を備えた Object
function arr(): iterable
{
return [1, 2, 3];
}
function gen(): iterable
{
yield 1;
yield 2;
yield 3;
}
foreach (arr() as $value) {}
foreach (gen() as $value) {}
Objects
object = クラスインスタンスのこと。
class Dog
{
public function bark()
{
echo "bow!";
}
}
$dog = new Dog;
$dog->bark();
object へのキャスト
-
object へキャストした場合は、
stdClass
というビルトインクラスを基にしたインスタンスが作成される。 -
NULL はプロパティを持たないインスタンスに変換される
var_dump((object) null);
/*
object(stdClass)#1 (0) {}
*/ -
Array は、key-value がそのまま property-value に変換される。
$arr = [
"name" => "john",
"age" => 33,
];
var_dump((object) $arr);
/*
object(stdClass)#1 (2) {
["name"]=> string(4) "john"
["age"]=> int(33)
}
*/ -
int や string など、scalar な値は、
scalar
というプロパティに格納される。var_dump((object) 123);
/*
object(stdClass)#1 (1) {
["scalar"]=> int(123)
}
*/
Resources
- 外部への参照を持つ、特別な値。
- 作成や使用の際は、特別なファンクションを使う。
- メモリの開放は自動で行われる。ただし、データベースへのコネクションだけは別である。
null
変数が値を持っていないことを示す。
- null を明示的にセットした変数
- まだ一度も値がセットされていない変数
- unset()された Key 又は Array
null へのキャスト
昔は(unset)
が使えたが、今は強く非推奨。
Callbacks / Callables
call_user_func()
or usort()
など、いくつかのファンクションは、コールバックを受け取ることができる。
コールバックの渡し方は下記の 4 つがある。
- 文字列で渡す方法
- array で渡す方法
- object を渡す方法
- Anonymous Function を渡す方法
シンプルな関数をコールバックに指定
function myCallbackFunction($text = "")
{
echo 'hello world!'.$text;
}
call_user_func('myCallbackFunction');
call_user_func('myCallbackFunction','hello2');
クラスメソッド、インスタンスメソッドをコールバックに指定
注意:JS と異なり、PHP ではクラスメソッドをインスタンスを起点にして呼ぶことができる。
// An example callback method
class MyClass
{
public static function myCallbackMethod()
{
echo 'Hello World!';
}
}
// Static class method call
call_user_func('MyClass::myCallbackMethod');
call_user_func(array('MyClass', 'myCallbackMethod')); // old fasion
// Object(instance) method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
親クラスのメソッドをコールバックに指定
class MyChildClass extends MyClass
{
public static function myCallbackMethod()
{
echo "some message";
}
}
call_user_func(array('MyChildClass', 'parent::myCallbackMethod')); // => Hello World!
__invoke
を実装しているクラスのインスタンスをコールバックに指定
class MyInvokableClass
{
public function __invoke($name)
{
echo 'Hello ', $name, "\n";
}
}
$c = new MyInvokableClass();
call_user_func($c, 'PHP!');
Closure
Closure = Anonymous function のこと。
// closure
$double = function ($a) {
return $a * 2;
};
$new_numbers = array_map($double, [1,2,3,4,5]);
// => 2,4,6,8,10
Pseudo-types
PHP のドキュメントにおいて、説明の便宜上、定義しているタイプのこと。引数のタイプや値を正しく説明するための架空のものであり、実際の PHP のプリミティブタイプとして存在するわけではない。
mixed
いくつかのタイプを受け取る事ができるタイプ。例)gettype()
number
integer + float
callback
callable のこと。callable が登場する以前は、callback という擬似タイプが存在していた。
array|object
array もしくは object
void
何もリターンしない、何も引数として受け付けない、というタイプ。PHP7.1 以降ではリターンタイプとして使える。