如何编写不同的PHP?
PHP是开发界讨论最多的编程语言之一。有人将其称为无效的编程语言,有人将其称为令人讨厌的编程语言,没有约定或体系结构,我同意其中的一些观点,因为他们有公平的观点。但是,在这里,我将分享我这些年来用PHP进行编程的经验。其中一些技巧仅在最新的PHP版本中可用,因此它们在旧版本中可能无法使用。
类型提示和返回类型
就数据类型而言,PHP并不是一种完美的语言,但是您可以使用类型提示和返回类型来提高代码质量并防止进一步的类型冲突。使用PHP的这些功能的人并不多,并不是所有的PHP程序员都知道这是可能的。
<?php function greet_user(User $user, int $age): void { echo "Hello" . $user->first_name . " " . $user->last_name; echo "\nYou are " . $age . " years old"; }
可以在参数变量之前使用类型的名称或类声明类型提示,并在冒号后的函数签名之后声明返回类型。
在像Laravel这样的框架中设计控制器时,可以更高级地使用它:
<?php class UserController extends Controller { // User sign up controller public function signUp(Request $request): JsonResponse { // Validate data $request->validate([ 'plateNumber' => 'required|alpha_num|min:3|max:20|unique:users,plate_number', 'email' => 'required|email|unique:users', 'firstName' => 'required|alpha', 'lastName' => 'required|alpha', 'password' => 'required|min:8', 'phone' => 'required|numeric|unique:users' ]); // Create user $new_user = new User; $new_user->plate_number = trim(strtoupper($request->input('plateNumber'))); $new_user->email = trim($request->input('email')); $new_user->first_name = trim($request->input('firstName')); $new_user->last_name = trim($request->input('lastName')); $new_user->password = Hash::make($request->input('password')); $new_user->phone = trim($request->input('phone')); $new_user->save(); return response()->json([ 'success' => true, ]); } }
三元运算符
三元运算符是几乎70%的程序员都知道并广泛使用的东西,但是如果您不知道三元运算符是什么,请参见以下示例:
<?php $age = 17; if($age >= 18) { $type = 'adult'; } else { $type = 'not adult'; }
可以使用三元运算符将此代码简化为以下代码:
<?php $age = 17; $type = $age >= 18 ? 'adult' : 'not adult';
如果满足条件,则不将第二部分分配给该变量。
如果要使用条件的值(如果它被评估为真实值),则还有一种更短的方法。
<?php $url = 'http://example.com/api'; $base_url = $url ? $url : 'http://localhost';
如您所见$url,既用作条件又用作条件为真的结果。在这种情况下,可以转义左侧操作数:
<?php $url = 'http://example.com/api'; $base_url = $url ?: 'http://localhost';
空合并运算符
就像三元运算符一样,您可以使用空合并运算符来查看值是否存在,请注意,因为false本身就是值,所以现存值与错误值不同。
<?php $base_url = $url ?? 'http://localhost';
现在$base_url等于,http://localhost但是如果我们将其定义$url为false,则$base_url变量将等于false。
<?php $url = false; $base_url = $url ?? 'http://localhost';
使用此运算符,您可以检查以前是否定义了变量,以及是否未为其分配值:
<?php $base_url = 'http://example.com'; $base_url = $base_url ?? 'http://localhost';
您可以使用空合并分配运算符来缩短此代码
<?php $base_url = 'http://example.com'; $base_url ??= 'http://localhost';
所有这些nall合并技术都可以在数组值上实现。
<?php $my_array = [ 'first_name' => 'Adnan', 'last_name' => 'Babakan' ]; $my_array['first_name'] ??= 'John'; $my_array['age'] ??= 20;
上面的数组将具有first_nameas,Adnan因为它已经被定义,但是将定义一个名为的新键,age并为其指定编号20,因为它不存在。
飞船运算符
当您想知道哪个操作数更大而不是仅知道一侧是否更大时,太空飞船算符是一个非常有用的运算符。
飞船操作者将返回的一个1,0或-1值时,左边的操作数较大时,当两个操作数是相等的,并且当右操作数分别是较大的。
<?php echo 5 <=> 3; // result: 1 echo -7 <=> -7; // result: 0 echo 9 <=> 15; // result: -1
很简单,但非常有用。
当您意识到太空飞船操作员也可以比较其他事物时,这将变得更加有趣:
<?php // String echo 'c' <=> 'b'; // result: -1 // String case echo 'A' <=> 'a'; // result: 1 // Array echo [5, 6] <=> [2, 7]; // result: 1
箭头函数
如果您曾经编写过JavaScript应用程序,尤其是使用其最新版本进行编程,则应该熟悉箭头功能。箭头函数是一种定义没有范围的函数的较短方法。
<?php $pi = 3.14; $sphere_volume = function($r) { return 4 / 3 * $pi * ($r ** 3); }; echo $sphere_volume(5);
上面的代码将引发错误,因为$pi未在此特定函数的范围内定义变量。如果我们想使用它,我们应该稍微改变一下我们的功能:
<?php $pi = 3.14; $sphere_volume = function($r) use ($pi) { return 4 / 3 * $pi * ($r ** 3); }; echo $sphere_volume(5);
因此,现在我们的函数可以使用$pi在全局范围内定义的变量。
但是做这些事情的更短的方法是使用箭头功能。
<?php $pi = 3.14; $sphere_volume = fn($r) => 4 / 3 * $pi * ($r ** 3); echo $sphere_volume(5);
如您所见,它非常简单整洁,默认情况下可以访问全局范围。
推荐教程:《PHP》