PHP

PHPでハマりそうなとこTips その1

More than 3 years have passed since last update.


requireの/はどれだけあってもいい。

PHPの仕様というより、OSの仕様らしい。

test.php


test.php

<?php

require_once './/////////////////include.php';


include.php


include.php

<?php

echo 'hoge';


実行結果

$ php test.php

hoge


メソッドの引数が少ないのはダメだが、多い分には問題無い

引数が少ない場合

<?php

function say($hoge) {
echo $hoge . PHP_EOL;
}

say();

$ php test.php

Warning: Missing argument 1 for say(), ...

引数が多い場合

<?php

function say($hoge) {
echo $hoge . PHP_EOL;
}

say('fizz', 'buzz');

$ php test.php

fizz


配列のインデックスと配列の順番は関係無い

配列には順番があるが、それは配列のインデックス(キー)とは別の概念である。他の言語をやっているとハマる。

勘違いしそうな例1

<?php

$array = [];
$array[0] = 0;
$array[4] = 4;
$array[2] = 2;
$array[3] = 3;
$array[1] = 1;
var_dump($array);

// 配列の3番目以降を切り出す
$sliced_array = array_slice($array, 3);
var_dump($sliced_array);

$ php test.php

array(5) {
[0]=>
int(0)
[4]=>
int(4)
[2]=>
int(2)
[3]=>
int(3)
[1]=>
int(1)
}
array(2) {
[0]=>
int(3)
[1]=>
int(1)
}
// [3, 4] が取り出されるわけではない
// インデックスも張り替えられる

インデックスではなく、配列に入れた順番で後ろの二つが切り出される。

勘違いしそうな例2

<?php

$array1 = [];
$array1[0] = 0;
$array1[4] = 4;
$array1[2] = 2;
$array1[3] = 3;
$array1[1] = 1;

$array2 = [];
$array2[0] = 0;
$array2[1] = 1;
$array2[2] = 2;
$array2[3] = 3;
$array2[4] = 4;

var_dump($array1 === $array1);
var_dump($array1 === $array2);

$ php test.php

bool(true) // 同じ配列を比較しているので当然true
bool(false) // キー => 値 の組み合わせが同じでも順番が違うのでfalse


str_replace の第一引数の配列を渡した時の処理順について

var_dump(str_replace(["\t", "\n", "\r\n", "\r"], " ", "\r\n"));

var_dump(str_replace(["\t", "\r\n", "\n", "\r"], " ", "\r\n"));

string(2) "  "

string(1) " "

どういうことかというと、

str_replace($array, $after, $str) {

foreach($array as $before) {
str_replace($before, $after,$str);
}
}

みたいな感じになっていると思われる。