对于PHP初学者,介绍了PHP的规范和一些实用函数的使用方法等
首先
這是一篇介紹在我作為二年PHP經驗的人接觸PHP時,我認為應該知道和使用的一些規範和實用函數的文章。(如果有錯誤,請指正!)
假设
关于 PHP 的版本,我以 8.2 作为前提。
isset、empty、is_null的区别。
These are the differences between isset、empty、is_null.
判断一个值是否存在,通常会使用以下三个基本方法。
-
isset
empty
is_null
以下的表格非常清楚地显示了可取值之间的差异。
引用:PHP 中 isset、empty 和 is_null 的区别快速查询表
重要的是要确切理解和正确运用这些情况下哪些值会使条件为真(true)。
在使用PHP实现守护子句、异常处理等方面,这些行为差异非常严重。
即使是一点点的误解或不恰当的函数使用也会导致错误和故障。
记住以下两点,就能更顺利地分别使用它们。
了解布尔类型在转换(强制类型转换)时被视为false的值的情况。
当进行boolean的显式类型转换时,返回false的值如下:
-
boolean の false
integer の 0 (ゼロ)
float の 0.0 および -0.0 (ゼロ)
空の文字列 “”、 および文字列の “0”
要素の数がゼロである 配列
NULL
var_dump((bool) false); // false
var_dump((bool) 0); // false
var_dump((bool) 0.0); // false
var_dump((bool) ""); // false
var_dump((bool) "0"); // false
var_dump((bool) []); // false
var_dump((bool) null); // false
在将其转换为布尔型时被视为false的值(以下称为”假值”)用于判断时,使用的是empty。
当查看上表时,可以发现在上述情况下所有都是真(true)。

而且,if($var)是与empty完全相反的动作。
换句话说,当我们将$var作为if($var)的条件时,只有当将其转换为布尔值并被视为true时(empty函数将其视为false),才满足条件。
当isset的参数不是”未定义或者NULL”时,返回真(true)。
如果您查看表格,您会明白isset在值不是“未定义或NULL”时返回true。
换句话说,除了这两种情况之外,它将返回true。
另外,is_null会返回isset完全相反的结果(当isset为true时,is_null将为false)。

逻辑与(&&)、逻辑或(||)的评估行为
只有当逻辑与(&&)运算符的左右两个值都为true时,它才会返回true,但如果左边的值为false,则不会对右边的值进行评估。换句话说,以下的hoge函数将不会被调用。经常使用JS和TS的人可能对这种行为很熟悉。
function hoge()
{
echo 'hoge' . PHP_EOL;
return true;
}
if (false && $hoge = hoge()) { // 左の値がfalseのため右の値(hoge関数)は評価されない
echo 'fuga';
};
// 出力なし
一方,就逻辑而言,当运算符的左边值为真时,右边的值就不会被评估。(只有当左边的值为假时才会评估右边的值)
function hoge()
{
echo 'hoge' . PHP_EOL;
return true;
}
if (true || $hoge = hoge()) { // 左の値がtrueのため右の値(hoge関数)は評価されない
echo 'fuga';
};
// fuga
使用三元运算符的简写形式(Elvis运算符)和Null合并运算符予以区分。
当Null合并运算符的左侧的值被“isset评估为true”的情况下,返回左侧的值;否则返回右侧的值。
$arr = [];
$arr[0] = null;
$hoge = $arr[0] ?? 'fuga'; // 左の値がnull(issetでfalseと評価される)のため右の値を返す
var_dump($hoge); // 'fuga'
如果左边的值是空字符串或空数组,那么使用isset函数会返回True,从而返回左边的值。
$arr = [];
$arr[0] = '';
$arr[1] = [];
$hoge1 = $arr[0] ?? 'fuga';
$hoge2 = $arr[1] ?? 'fuga';
var_dump($hoge1); // ''
var_dump($hoge2); // []
当左侧的值为falsy值时,可以使用Elvis运算符(三元运算符的简化形式)返回右侧的值。
$arr = [];
$arr[0] = '';
$arr[1] = [];
$arr[2] = null;
$hoge1 = $arr[0] ?: 'fuga';
$hoge2 = $arr[1] ?: 'fuga';
$hoge3 = $arr[2] ?: 'fuga';
var_dump($hoge1); // 'fuga'
var_dump($hoge2); // 'fuga'
var_dump($hoge3); // 'fuga'
动态属性是可设置的(但不应该使用)
在PHP中,您可以轻松地设置动态属性。
class Hoge{}
$hoge = new Hoge();
$hoge->test = 'test';
var_dump($hoge);
object(Hoge)#1 (1) {
["test"]=>
string(4) "test"
}
然而,我们应该避免使用它。(在PHP8.2中,动态属性已被弃用)
不知道属性被设置在哪里和什么属性的情况会成为意料之外的错误和故障的温床。
使用array_filter函数来删除假值。
当需要将以下数组中的null或空字符串值删除时,我们该如何做呢?
$arr = [
0 => 'hoge',
1 => null,
2 => 'test',
3 => 3,
4 => '',
];
如果想要筛选数组的元素,使用array_filter似乎是一个不错的选择。
就像这样…
$newArr = array_filter($arr, fn ($value) => ! empty($value));
var_dump($newArr);
array(3) {
[0]=>
string(4) "hoge"
[2]=>
string(4) "test"
[3]=>
int(3)
}
在这里,array_filter函数如果没有指定第二个参数,则具有这样的特性:它将删除假值(关于假值的不同之处请参考isset、empty、is_null的区别),因此,上述描述可以简化为以下形式。
$newArr = array_filter($arr);
var_dump($newArr);
array(3) {
[0]=>
string(4) "hoge"
[2]=>
string(4) "test"
[3]=>
int(3)
}
使用array_values函数来重新为数组分配索引值。
当查看上述array_filter函数删除后的最终输出时,可以明显看到数组的索引仍然保持原始数组的索引,并不是连续的序列。
array(3) {
[0]=>
string(4) "hoge"
[2]=>
string(4) "test"
[3]=>
int(3)
}
当我们希望将这种数组的索引按正确的顺序排列时,array_values非常方便。(array_values本来是一个返回数组中所有值的函数)
$arr = [
0 => 'hoge',
1 => null,
2 => 'test',
3 => 3,
4 => '',
];
$newArr = array_filter($arr);
$newArr2 = array_values($newArr);
var_dump($newArr2);
array(3) {
[0]=>
string(4) "hoge"
[1]=>
string(4) "test"
[2]=>
int(3)
}
传递null给array_map的回调函数,执行数组的zip操作。
array_map函数可以在第二个参数(及以后)中指定多个数组。
因此,您可以通过将null作为第一个参数传递来执行数组的zip操作。
$arr = [
1,
2,
3,
];
$arr2 = [
'one',
'two',
'three',
];
$newArr = array_map(null, $arr, $arr2);
var_dump($newArr);
array(3) {
[0]=>
array(2) {
[0]=>
int(1)
[1]=>
string(3) "one"
}
[1]=>
array(2) {
[0]=>
int(2)
[1]=>
string(3) "two"
}
[2]=>
array(2) {
[0]=>
int(3)
[1]=>
string(5) "three"
}
}
switch和match的区别。
在可以使用match表达式的情况下,最好尽可能使用match表达式。与switch不同,match表达式进行了严格的值比较,因此很少出现错误,并且可以返回值,非常方便。
-
switchを使う場合
$variable = '1';
$result = '';
switch ($variable) {
case 1:
$result = 1;
break;
case 2:
$result = 2;
default:
break;
}
var_dump($result); // int(1) 緩やかな比較のため型が異なっていてもエラーではない
-
matchを使う場合(matchは式のため値を返せる)
function hoge(string|int $variable): int
{
return match ($variable) {
'1' => 1,
'2' => 2,
default => 3
};
}
var_dump(hoge('1')); // int(1)
var_dump(hoge(1)); // int(3) 厳格な比較のためintの場合はdefaultに
如果在json_decode函数的第二个参数中指定true,则该值将被解码为关联数组。
json_decode函数默认返回对象(stdClass)。
$arr = [
'hoge' => 'fuga',
];
$json = json_encode($arr);
$decodedValue = json_decode($json);
var_dump($decodedValue);
object(stdClass)#1 (1) {
["hoge"]=>
string(4) "fuga"
}
如果将第二个参数设为true,可以以关联数组形式接收数据。虽然不太引人注意,但了解这点会很方便。
$arr = [
'hoge' => 'fuga',
];
$json = json_encode($arr);
$decodedValue = json_decode($json, true);
var_dump($decodedValue);
array(1) {
["hoge"]=>
string(4) "fuga"
}
尽量在in_array函数的第三个参数中指定为true。
可以通过将true作为in_array函数的第三个参数来进行严格比较,以确定第一个参数的值是否与第二个参数的数组值严格相等。
在涉及到switch和match的讨论中,PHP中经常出现关于严格比较(考虑类型)和宽松比较的话题。
尽可能使用严格的比较来编写类型安全的代码。(然而,在无法准确理解传入值类型的情况下,也可能使用宽松的比较。)
$arr = [1, 2, 3];
$value = '1';
var_dump(in_array($value, $arr)); // true
$arr = [1, 2, 3];
$value = '1';
var_dump(in_array($value, $arr, true)); // false
指定返回值的类型
请在函数的返回值中指定类型。
如果返回值的类型不是指定的类型,将抛出异常。
在PHP 7.4.0及以上版本中,您可以为函数的参数、返回值以及类的属性声明类型。这样一来,您可以确保该值是特定的类型。如果不是该类型,则会抛出TypeError错误。
引用:类型声明
function test(): int
{
return 'test';
}
$test = test();
var_dump($test); // PHP Fatal error: Uncaught TypeError: test(): Return value must be of type int, string returned
使用PHP8版本以上的功能
让我们积极运用 PHP8系及以上的功能。
如果版本低于8系,需要立即进行升级。
特に
-
名前付き引数
コンストラクタの省略記法
ユニオン型
Match式
Nullセーフ演算子
Enum
readonlyプロパティ
readonlyクラス
我很常使用等等,而且它非常方便。
PHP的结束标签可以省略。
让我们省略只包含PHP代码的文件的PHP结束标签。
如果文件只包含 PHP 代码,建议省略文件的最后结束标签。如果在结束标签之后有额外的空格或换行符,可能会导致意外行为。因为额外的空格或换行符会导致 PHP 开始输出缓冲,无意中输出当前内容。