AHdark
一个多语种开发蒟蒻
AHdark Blog

PHP的一些小知识

正文

关于 ?? 的使用

最近的一次Commit中,你可以看到我在代码中修改出大量的??语法

Compare: inc/Ability/EmbedVideo.php
Compare: inc/Aliyun/Aliplayer.php

在其中,我们要了解??的意义

?? 的功能

前端提交form到后端验证,应传入参数 a

通常情况下我们会对$a的存在进行校验,我们将校验结果存入$b

即为:若$a存在,$b = $a。若$a不存在,$b = 0

$a = $_GET["a"];

// 原有写法
$b = isset($a)?$a:0;

// 原有写法的意义
if (isset($a)) {
    $b = $a;
} else {
    $b = 0;
}

// 更好的写法
$b = $a ?? 0;

将原有写法写成更简洁的??语法有益于阅读程序,在此处可能体现并不明显,但在如下案例则显然

// 原有写法
$videoId    = isset($meta['videoId'])   ? $meta['videoId']  : '';
$source     = isset($meta['source'])    ? $meta['source']   : '';
$oss        = isset($meta['oss'])       ? $meta['oss']      : false;
$width      = isset($meta['width'])     ? $meta['width']    : '100%';
$height     = isset($meta['height'])    ? $meta['height']   : '500px';
$poster     = isset($meta['thumbnail']) ? $meta['thumbnail']: '';
$endpoint   = isset($meta['endpoint'])  ? $meta['endpoint'] : MINECLOUDVOD_SETTINGS['alivod']['endpoint'];
$markers    = isset($meta['markers'])   ? $meta['markers']  : false;
$captions   = isset($meta['captions'])  ? $meta['captions'] : false;
$slide      = isset($meta['slide'])     ? $meta['slide']    : true;
$slidetext  = isset($meta['slidetext']) ? $meta['slidetext']: false;
$isLive     = isset($meta['live'])      ? $meta['live']     : false;
$autoplay   = isset($meta['autoplay'])  ? $meta['autoplay'] : (MINECLOUDVOD_SETTINGS['aliplayerconfig']['autoplay']? true : false);
$countdown  = isset($meta['countdown']) ? $meta['countdown']: false;

// ??写法
$videoId = $meta['videoId'] ?? '';
$source = $meta['source'] ?? '';
$oss = $meta['oss'] ?? false;
$width = $meta['width'] ?? '100%';
$height = $meta['height'] ?? '500px';
$poster = $meta['thumbnail'] ?? '';
$endpoint = $meta['endpoint'] ?? MINECLOUDVOD_SETTINGS['alivod']['endpoint'];
$markers = $meta['markers'] ?? false;
$captions = $meta['captions'] ?? false;
$slide = $meta['slide'] ?? true;
$slidetext = $meta['slidetext'] ?? false;
$isLive = $meta['live'] ?? false;
$autoplay = $meta['autoplay'] ?? (MINECLOUDVOD_SETTINGS['aliplayerconfig']['autoplay'] ? true : false);
$countdown = $meta['countdown'] ?? false;

清晰可见的代码大小缩减和可阅读性增强

扩展

// 同样
$a = $a ? $a : 0;
// 等价于
$a = $a ?: 0;

并且要注意的是,使用empty()要比isset()快得多

关于常量定义

常量与变量

  1. 常量前面没有美元符号($)
  2. 常量只能通过define()函数定义,而不能通过赋值语句
  3. 常量可以不用理会变量的作用域在任何地方定义和访问
  4. 常量一旦定义就不能重新定义或取消定义
  5. 常量的值只能是标量(boolean、integer、float和string)

关于常量

众所周知,PHP中全局常量定义有两种方法:define()const

而常规的常量(constant) 是使用const定义

defineconst的区别

  1. const是一个语言结构;const定义的常量是大小写敏感。而define是一个函数,可以通过第三个参数来指定是否区分大小写。true表示大小写不敏感,默认为false。例如:define('PI', 3.14, true);
  2. const简单易读,编译时要比define快很多
  3. const可在类中使用,用于类成员常量定义(在php 5.3.0以后,可以使用const关键字在类定义的外部定义常量),定义后不可修改,const在类内定义常量,并且const必须通过类名::变量名来进行访问;define不能在类中使用,可用于全局变量
  4. const是在编译时定义,因此必须处于最顶端的作用区域,不能在函数,循环及if条件中使用;而define是函数,也就是能调用函数的地方都可以使用
  5. const只能用普通的常量名,define常量名中可以有表达式
  6. const定义的常量只能是静态常量,define可以是任意表达式

也就是说,define并非真正的“常量”

// 使用const常量定义静态内容的速度较快效果较好
const VERSION = '1.0.0';

// 但不论表达式内容是否为全常量,都必须使用define定义
define('URL', 'https://source.ahdark.com/wordpress/'.VERSION);

// 而且,如果define定义的表达式内容有变量,当变量改变,define的返回内容会随之改变
define('URL', 'https://source.ahdark.com/wordpress/'.$_GET['v']);

以上就是这篇文章的全部内容了,希望本文的内容对大家的PHP学习或者工作具有一定的参考价值

赞赏
本文链接:https://ahdark.com/technology/1023.shtml
本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可
欢迎加入Q群交流:654022768

AH Dark

文章作者

本博客的运营者、主要开发者、主要作者 深度学习算法工程师,后端工程师,嵌入式软件开发工程师 Azure认证 运维工程师

发表评论

textsms
account_circle
email

AHdark Blog

PHP的一些小知识
浅谈PHP的一些小知识和小细节以更好的规范语法和理解代码
扫描二维码继续阅读
2021-10-01