当前位置: 首页 > news >正文

PHP语法基础

PHP语法基础

一,变量

在PHP中,变量是存储数据的容器,其灵活性和动态类型系统是PHP的核心特性之一。以下是PHP变量的详细解析,涵盖声明、作用域、类型转换及最佳实践:


1. 变量基础

声明与命名规则
  • 无需显式声明类型:PHP是动态类型语言,变量类型由赋值决定。

  • $符号开头

    $name = "Alice";  // 字符串
    $age = 25;        // 整数
    $price = 19.99;   // 浮点数
    $isActive = true; // 布尔值
    
  • 命名规则

    • 以字母或下划线开头,后可接字母、数字、下划线。
    • 区分大小写($Var$var不同)。
变量类型

PHP支持8种原始数据类型:

类型示例描述
整型(int)$count = 100;无小数点的整数
浮点型(float)$price = 9.99;含小数点的数或科学计数法表示
字符串(string)$text = "Hello";文本(单引号或双引号包裹)
布尔型(bool)$isValid = true;truefalse
数组(array)$colors = ["red", "blue"];有序键值对集合
对象(object)$user = new User();类的实例化
NULL$data = null;表示变量无值
资源(resource)$file = fopen("a.txt");外部资源句柄(如文件、数据库连接)

2. 变量作用域

作用域分类
  1. 局部变量
    在函数内部声明,仅函数内有效。

    function test() {$localVar = "Inside function"; // 局部变量echo $localVar;
    }
    test(); // 输出 "Inside function"
    echo $localVar; // 报错:未定义变量
    
  2. 全局变量
    在函数外部声明,需通过global关键字或$GLOBALS数组访问。

    $globalVar = "Outside function";
    function readGlobal() {global $globalVar;echo $globalVar; // 输出 "Outside function"
    }
    
  3. 静态变量
    使用static关键字,函数多次调用时保留值。

    function counter() {static $count = 0;$count++;echo $count;
    }
    counter(); // 1
    counter(); // 2
    
  4. 超全局变量
    预定义全局数组,跨作用域直接访问,如:

    • $_GET:获取URL参数。
    • $_POST:接收表单POST数据。
    • $_SESSION:会话变量。
    • $_SERVER:服务器信息(如$_SERVER['REQUEST_URI'])。

3. 变量处理技巧

可变变量(Variable Variables)
  • 通过变量名动态访问变量:

    $varName = "message";
    $$varName = "Hello!"; // 等价于 $message = "Hello!";
    echo $message; // 输出 "Hello!"
    
引用变量(By Reference)
  • 使用&创建变量别名,修改引用会同步原变量:

    $a = 10;
    $b = &$a;
    $b = 20;
    echo $a; // 输出 20
    
类型检测与转换
  • 检测类型

    $value = "123";
    var_dump(is_int($value));   // bool(false)
    var_dump(is_numeric($value)); // bool(true)
    
  • 强制类型转换

    $num = (int)"42.5";    // 转为整型(42)
    $str = (string)100;    // 转为字符串("100")
    

4. 安全性注意事项

  1. 未初始化变量
    直接使用未赋值变量会触发E_WARNING,建议初始化:

    // 错误示例
    echo $undefinedVar; // 警告:Undefined variable
    // 正确做法
    $undefinedVar = isset($undefinedVar) ? $undefinedVar : "default";
    
  2. 用户输入过滤
    $_GET$_POST等输入进行过滤,避免安全漏洞:

    $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
    
  3. 避免直接输出用户数据
    防止XSS攻击,使用htmlspecialchars转义:

    echo htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');
    

5. 最佳实践

  • 命名规范
    使用驼峰式($userName)或蛇形命名($user_name),保持一致性。

  • 类型声明(PHP 7+)
    通过严格类型提升代码可预测性:

    declare(strict_types=1); // 启用严格模式
    function add(int $a, int $b): int {return $a + $b;
    }
    
  • 使用===比较
    避免类型转换导致的意外结果:

    if (0 == "0") { // true(松散比较)
    if (0 === "0") { // false(严格比较)
    

总结

特性说明示例
动态类型变量类型由赋值决定$x = "text"; $x = 10;
作用域控制局部、全局、静态作用域区分清晰global, static
超全局变量直接访问用户输入、会话等数据$_POST['email']
类型转换与检测灵活转换但需注意安全性(int), is_array()
引用与可变变量动态操作变量名或别名$$var, $a = &$b

二,常量

在PHP中,常量是一种不可变的值,一旦定义后无法修改或重新声明。常量的全局性和持久性使其适合存储配置参数、固定值或全局标识符。以下是PHP常量的详细解析,涵盖定义方式、作用域、使用场景及最佳实践:


1. 常量的定义方式

(1) 使用 define() 函数
  • 语法

    define(string $name, mixed $value [, bool $case_insensitive = false])
    
  • 特点

    • 可在运行时动态定义(例如在条件语句或函数内)。
    • 支持定义大小写不敏感的常量(不推荐,PHP 7.3+已废弃此特性)。

示例

define("SITE_NAME", "MyWebsite");
define("MAX_USERS", 1000, true); // 不推荐使用大小写不敏感
echo SITE_NAME; // 输出 "MyWebsite"
(2) 使用 const 关键字
  • 语法

    const CONSTANT_NAME = value;
    
  • 特点

    • 必须在编译时定义(不能在函数、循环或条件语句中使用)。
    • 代码更简洁,推荐在类或全局作用域使用。

示例

const API_KEY = "abc123";
const PI = 3.14159;
echo PI; // 输出 3.14159

2. 常量与变量的区别

特性常量变量
定义方式define()const$var = value;
作用域全局(跨函数、类访问)局部或全局(需global声明)
可变性不可重新赋值或取消定义可随时修改
命名规则默认区分大小写,推荐全大写加下划线区分大小写,自由命名
数据类型支持标量(int, string等)和数组(PHP7+)支持所有PHP数据类型

3. 常量的作用域

  • 全局性:常量一旦定义,可在脚本的任何位置访问(包括函数、类内部)。

  • 示例

    define("VERSION", "1.0.0");function showVersion() {echo "版本号:" . VERSION; // 直接访问
    }class App {public function getVersion() {return VERSION; // 类内访问}
    }
    

4. 常量的命名与规范

  • 命名规则
    • 以字母或下划线开头,后接字母、数字、下划线。
    • 传统约定:全大写字母 + 下划线分隔(如 DB_HOST)。
  • 避免冲突
    • 不要使用PHP保留关键字(如 __CLASS__)。
    • 使用唯一的前缀减少命名冲突(如项目缩写 MYAPP_LOGO_PATH)。

5. 预定义常量

PHP中最常见的预定义常量及其用途:

常量名称类型/分类描述示例值
__LINE__魔术常量当前行号(在脚本中的位置)42
__FILE__魔术常量当前文件的完整路径和文件名/var/www/app/index.php
__DIR__魔术常量当前文件所在目录的路径/var/www/app
__FUNCTION__魔术常量当前函数名称calculateTotal
__CLASS__魔术常量当前类名UserService
__METHOD__魔术常量当前类方法名(包含类名)UserService::getProfile
__NAMESPACE__魔术常量当前命名空间名称MyApp\Utils
PHP_VERSION环境/系统常量PHP解释器的版本号"8.2.0"
PHP_OS环境/系统常量运行PHP的操作系统类型"Linux""WINNT"
PHP_INT_MAX环境/系统常量整数最大值(64位系统为92233720368547758079223372036854775807
PHP_FLOAT_EPSILON环境/系统常量浮点数最小差值(PHP 7.2+)2.2204460492503E-16
DIRECTORY_SEPARATOR环境/系统常量目录分隔符(Linux为/,Windows为\"/""\\"
PATH_SEPARATOR环境/系统常量路径分隔符(Linux为:,Windows为;":"";"
E_ERROR错误处理常量致命运行时错误(不可恢复的错误)1
E_WARNING错误处理常量运行时非致命警告(脚本继续执行)2
E_PARSE错误处理常量编译时语法解析错误4
E_NOTICE错误处理常量运行时提示(可能的代码问题,如访问未定义变量)8
E_ALL错误处理常量所有错误和警告(通常用于error_reporting设置)32767(PHP 8.1+)
TRUE/FALSE/NULL布尔与空值常量布尔值truefalse和空值nulltrue, false, null
SORT_ASC/SORT_DESC数组排序常量数组升序(SORT_ASC)或降序(SORT_DESC4(升序), 3(降序)
其他常用常量
JSON_ERROR_NONEJSON处理常量JSON解析无错误0
ENT_QUOTESHTML转义常量转义单引号和双引号(用于htmlspecialcharsENT_QUOTES 的值为 3

使用场景示例

  1. 调试时获取上下文信息

    echo "当前文件:" . __FILE__ . ",第" . __LINE__ . "行";
    // 输出:当前文件:/app/index.php,第30行
    
  2. 动态加载文件

    require __DIR__ . '/config/database.php';
    
  3. 错误报告配置

    error_reporting(E_ALL); // 报告所有错误
    
  4. 跨平台路径处理

    $file = 'data' . DIRECTORY_SEPARATOR . 'logs.txt';
    

扩展说明

  • 魔术常量:以双下划线开头和结尾,值随上下文变化(如所在文件、行号等)。
  • 环境常量:反映PHP配置和运行环境,常用于编写跨平台兼容代码。
  • 错误级别常量:通过位掩码组合使用(如error_reporting(E_ERROR | E_WARNING))。

6. 常量的使用场景

  1. 配置参数
    存储数据库连接信息、API密钥等。

    define("DB_HOST", "localhost");
    define("DB_USER", "root");
    define("DB_PASS", "secret");
    
  2. 状态标识
    定义应用状态(如开发、生产模式)。

    const ENV_MODE = "development";
    
  3. 避免魔法数值
    用常量替代代码中的字面量,提升可读性。

    const MAX_LOGIN_ATTEMPTS = 5;
    if ($attempts > MAX_LOGIN_ATTEMPTS) {throw new Exception("登录尝试次数过多");
    }
    

7. 常量操作函数

  • 检测常量是否存在

    if (defined("VERSION")) {echo "常量已定义";
    }
    
  • 获取所有已定义常量

    $allConstants = get_defined_constants();
    print_r($allConstants);
    

8. 注意事项与最佳实践

  1. 不可重复定义
    重复定义常量会导致 PHP Warning

    define("SITE_NAME", "OldSite");
    define("SITE_NAME", "NewSite"); // 触发警告
    
  2. 数组常量(PHP7+)
    使用 define() 定义数组常量:

    define("COLORS", ["red", "green", "blue"]);
    echo COLORS[0]; // 输出 "red"
    
  3. 类常量
    在类中定义常量,支持可见性修饰符(PHP7.1+):

    class User {public const ROLE_ADMIN = "admin";private const MAX_AGE = 120;
    }
    echo User::ROLE_ADMIN; // 输出 "admin"
    
  4. 性能优化
    常量在编译时解析,访问速度略快于全局变量。


总结

操作代码示例
定义常量(define()define("API_URL", "https://api.example.com");
定义常量(constconst TIMEOUT = 30;
访问常量echo API_URL;
检测常量if (defined("TIMEOUT")) { ... }

核心原则

  • 优先使用 const(除非需要动态定义)。
  • 通过常量集中管理全局不可变值,增强代码可维护性。
  • 遵循命名规范,避免与系统常量冲突。

三,数据类型分类

PHP的数据类型可以分为标量类型、复合类型、特殊类型以及伪类型。以下是详细分类和说明:


一、标量类型(Scalar Types)

  1. 整型(Integer)

    • 表示整数,带符号(支持正负),取值范围依赖于平台(32位或64位)。
    • 可用进制:十进制(123)、十六进制(0x1A)、八进制(0123)、二进制(0b1110)。
    • 示例:$a = 42;
    • 类型检测:is_int()is_integer()
  2. 浮点型(Float/Double)

    • 表示小数或科学计数法数值(如 1.2e3)。
    • 精度问题:浮点数计算可能存在精度丢失(如 0.1 + 0.2 != 0.3)。
    • 示例:$b = 3.14;
    • 类型检测:is_float()
  3. 字符串(String)

    • 表示文本,支持单引号(不解析变量)、双引号(解析变量和转义字符)、Heredoc和Nowdoc语法。

    • 示例:

      $str1 = 'Hello';  
      $str2 = "World: $str1";  
      $str3 = <<<EOD  
      Multiline  
      EOD;  
      
    • 类型检测:is_string()

  4. 布尔型(Boolean)

    • 仅两个值:truefalse(不区分大小写,如 TRUE 也有效)。
    • 转换为 false 的情况:空字符串、0null、空数组等。
    • 示例:$flag = true;
    • 类型检测:is_bool()

二、复合类型(Compound Types)

  1. 数组(Array)

    • 有序键值对集合,键可以是整型或字符串,值可为任意类型。

    • 示例:

      $arr = [1 => "a", "name" => "PHP"];
      
    • 类型检测:is_array()

  2. 对象(Object)

    • 类的实例,包含属性和方法。

    • 示例:

      class MyClass {}  
      $obj = new MyClass();
      
    • 类型检测:is_object()

  3. 可调用(Callable)

    • 表示可调用的结构,如函数、方法、闭包或实现 __invoke() 的对象。

    • 示例:

      $callable = function() { echo "Hello"; };
      
    • 类型检测:is_callable()

  4. 可迭代(Iterable)

    • PHP 7.1+ 引入,可以是数组或实现 Traversable 接口的对象(如生成器)。

    • 示例:

      function gen(): iterable { yield 1; }
      
    • 类型检测:is_iterable()


三、特殊类型(Special Types)

  1. 空值(Null)
    • 唯一值 null,表示变量未赋值或已销毁(unset())。
    • 示例:$var = null;
    • 类型检测:is_null()
  2. 资源(Resource)
    • 外部资源句柄(如文件、数据库连接),由扩展创建。
    • 示例:$file = fopen("test.txt", "r");
    • 类型检测:is_resource()。资源释放后变量可能转为 null

四、伪类型(Pseudo-Types)

  • mixed
    表示任意类型(PHP 8.0+ 作为联合类型的一部分)。
  • void
    表示无返回值(用于函数声明)。
  • 其他
    number(int 或 float)、array|object 等,用于文档说明。

注意事项

  • 字符串与数字转换
    "123abc" 转整型为 123"abc123" 转整型为 0
  • 数组键类型
    字符串键 "8" 会转为整型 8,但 "08" 保留为字符串。
  • 资源管理
    资源需显式释放(如 fclose()),释放后变量可能变为 null
  • PHP版本差异
    PHP 8 中部分资源改为对象(如 PDO 相关),需注意兼容性。

四,数据类型转换

1.自动类型转换(隐式转换)

PHP 在表达式求值时会自动转换数据类型,例如:

$sum = 5 + "10";  // 15("10" 被转换为整数)
$sum = 5 + "10.5"; // 15.5("10.5" 被转换为浮点数)

转换规则:

  1. 字符串 → 数字

    • 只要字符串以数字开头,PHP 就会转换它。
    • 遇到非数字字符时,转换会停止。
    echo (int)"123abc";  // 输出 123
    echo (int)"abc123";  // 输出 0(无效转换)
    
  2. 布尔值转换

    • false 转换为 0true 转换为 1
    echo true + 1;  // 输出 2
    echo false + 1; // 输出 1
    
  3. 空字符串、NULL 转换

    • 空字符串 ""NULL 转换为 0
    echo (int)NULL;    // 0
    echo (int)"";      // 0
    
  4. 数组转换

    • 数组转换为整数时,始终返回 1(如果是空数组,则返回 0)。
    echo (int)[1, 2, 3]; // 1
    echo (int)[];        // 0
    

2. 显式类型转换(强制转换)

显式转换使用 (type) 语法:

$var = "100";
$intVar = (int)$var;      // 100
$floatVar = (float)$var;  // 100.0
$boolVar = (bool)$var;    // true

PHP 提供以下显式转换:

  • (int) 或 (integer) - 转换为整数
  • (bool) 或 (boolean) - 转换为布尔值
  • (float) 或 (double) 或 (real) - 转换为浮点数
  • (string) - 转换为字符串
  • (array) - 转换为数组
  • (object) - 转换为对象
  • (unset) - 转换为 NULL

示例:

echo (int)"123abc";  // 123
echo (bool)0;        // false
echo (float)"3.14abc"; // 3.14

3. 类型转换函数

PHP 提供了一些函数来进行数据类型转换:

函数作用
intval($var)转换为整数
floatval($var)转换为浮点数
boolval($var)转换为布尔值
strval($var)转换为字符串
settype($var, "type")直接改变变量类型

示例:

$var = "123abc";
echo intval($var);  // 123
echo floatval("3.14abc"); // 3.14
echo boolval(0);    // false

settype() 会直接修改变量的类型:

$var = "100";
settype($var, "int");
echo $var;  // 100(已变为整数)

4. 特殊转换

(1)字符串和数组转换

  • 字符串 → 数组

    • (array) 强制转换时,字符串会变成数组,索引 0 处存储整个字符串。
    $str = "Hello";
    $arr = (array)$str;
    print_r($arr);
    

    输出:

    Array ( [0] => Hello )
    
  • 数组 → 字符串

    • 数组转换为字符串时,返回 "Array"
    $arr = [1, 2, 3];
    echo (string)$arr; // 输出 "Array"
    

(2)对象和数组转换

  • 对象 → 数组

    class Test {public $a = 1;private $b = 2;protected $c = 3;
    }$obj = new Test();
    $arr = (array)$obj;
    print_r($arr);
    

    输出:

    Array ( [a] => 1 [\0Test\0b] => 2 [\0*\0c] => 3 )
    

    (私有和受保护属性在数组中有特殊键)

  • 数组 → 对象

    $arr = ["name" => "PHP", "version" => 8];
    $obj = (object)$arr;
    echo $obj->name;  // PHP
    

(3)JSON 和数据类型转换

PHP 提供 json_encode()json_decode() 进行转换:

$arr = ["name" => "PHP", "version" => 8];
$json = json_encode($arr);   // 转换为 JSON 字符串
$obj = json_decode($json);   // 转换为对象
print_r($obj);

5. 类型转换注意事项

  1. 字符串转换为数字时,非数字部分被忽略

    echo (int)"10abc"; // 10
    
  2. 浮点数转换为整数时会截断

    echo (int)3.99; // 3
    
  3. 布尔值转换

    • 空数组、空字符串、NULL0 转换为 false,其余为 true
    echo (bool)"";  // false
    echo (bool)"0"; // false
    echo (bool)"abc"; // true
    
  4. JSON 解析

    • 默认 json_decode() 返回对象,使用 true 作为第二个参数返回数组:
    $arr = json_decode('{"a":1,"b":2}', true);
    print_r($arr);
    

结论

PHP 的数据类型转换相对宽松,允许隐式转换,但容易导致意外结果。最佳实践:

  • 使用显式转换 ((int), (string), (bool))
  • 使用转换函数 (intval(), floatval(), boolval())
  • 避免依赖隐式转换(如 if ($var) 可能带来意外行为)
  • JSON 数据转换时注意数据结构(使用 true 作为参数转换为数组)

五,整数类型进制

1. 十进制转换为其他进制

PHP 提供了内置函数来进行转换:

  • decbin($num):十进制 → 二进制
  • decoct($num):十进制 → 八进制
  • dechex($num):十进制 → 十六进制

示例代码:

$num = 45;echo decbin($num) . PHP_EOL; // 输出: 101101(二进制)
echo decoct($num) . PHP_EOL; // 输出: 55(八进制)
echo dechex($num) . PHP_EOL; // 输出: 2d(十六进制)

2. 其他进制转换为十进制

  • bindec($num):二进制 → 十进制
  • octdec($num):八进制 → 十进制
  • hexdec($num):十六进制 → 十进制

示例代码:

echo bindec("101101") . PHP_EOL; // 输出: 45
echo octdec("55") . PHP_EOL;     // 输出: 45
echo hexdec("2d") . PHP_EOL;     // 输出: 45

3. 任意进制转换(2-36 进制)

如果需要在任意进制之间转换,可以使用 base_convert($num, $fromBase, $toBase) 函数。

示例代码:

echo base_convert("101101", 2, 10) . PHP_EOL; // 二进制转十进制,输出 45
echo base_convert("45", 10, 16) . PHP_EOL;   // 十进制转十六进制,输出 2d
echo base_convert("2d", 16, 8) . PHP_EOL;    // 十六进制转八进制,输出 55
echo base_convert("55", 8, 2) . PHP_EOL;     // 八进制转二进制,输出 101101

⚠️ 注意: base_convert() 适用于 2-36 进制之间的转换,如果超出范围,需要使用其他方法实现。


4. 自定义进制转换(支持更高进制)

如果需要支持超过 36 进制(例如 62 进制),可以自定义实现:

function custom_base_convert($num, $fromBase, $toBase) {$digits = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';$decimal = 0;// 先转为十进制for ($i = 0, $len = strlen($num); $i < $len; $i++) {$decimal = $decimal * $fromBase + strpos($digits, $num[$i]);}// 再从十进制转换为目标进制$result = '';while ($decimal > 0) {$result = $digits[$decimal % $toBase] . $result;$decimal = intval($decimal / $toBase);}return $result ?: '0';
}echo custom_base_convert("2d", 16, 62); // 十六进制转 62 进制

总结

函数作用
decbin($num)十进制 → 二进制
decoct($num)十进制 → 八进制
dechex($num)十进制 → 十六进制
bindec($num)二进制 → 十进制
octdec($num)八进制 → 十进制
hexdec($num)十六进制 → 十进制
base_convert($num, $fromBase, $toBase)任意进制转换(2-36)
自定义函数超过 36 进制转换

六,浮点型数据

1. 定义浮点数

  • 直接赋值:

    $a = 3.14;
    $b = -0.001;
    
  • 科学计数法:

    $c = 1.2e3; // 1200
    $d = 5E-3;   // 0.005
    

2. 精度问题

  • 二进制表示误差:某些十进制小数(如0.1)无法精确表示为二进制浮点数,导致计算误差。

    echo 0.1 + 0.2; // 输出 0.30000000000000004,而非精确的0.3
    
  • 比较浮点数:避免直接使用==,改用差值比较:

    $epsilon = 1e-10;
    if (abs($a - $b) < $epsilon) {echo "相等";
    }
    

3. 特殊值

  • NAN(非数值):无效运算结果(如sqrt(-1))。

  • INF(无穷大):超出浮点数范围的值(如1e300 * 1e300)。

  • 检测方法:

    is_nan($value);   // 检测是否为NAN
    is_infinite($value); // 检测是否为INF
    

4. 类型转换与判断

  • 显式转换

    $float = (float)"3.14"; // 字符串转浮点数
    $float = floatval("3.14");
    
  • 类型检测

    is_float($a);      // true
    var_dump($a);      // 输出 float(3.14)
    

5. 范围与常量

  • 最大值/最小值

    echo PHP_FLOAT_MAX; // 1.7976931348623e+308(平台相关)
    echo PHP_FLOAT_MIN; // 2.2250738585072e-308(最小正浮点数)
    

6. 运算与自动转换

  • 混合类型运算时,结果自动转为浮点型:

    echo 5 + 2.5; // 输出 7.5(浮点数)
    

7. 格式化输出

  • 控制显示精度:

    echo number_format(0.1 + 0.2, 2); // 输出 0.30
    echo sprintf("%.2f", 0.1 + 0.2);  // 输出 0.30
    

8. 注意事项

  • 避免作为数组键:浮点数键会转换为整数,可能导致冲突。
  • 高精度需求:使用BC MathGMP扩展处理精确计算(如财务数据)。

示例代码

// 浮点数定义与精度问题
$num1 = 0.1;
$num2 = 0.2;
$sum = $num1 + $num2; // ~0.30000000000000004// 正确比较方式
if (abs($sum - 0.3) < 1e-10) {echo "实际相等";
}// 特殊值检测
$nan = acos(8); // 无效反余弦值
if (is_nan($nan)) {echo "这是非数值";
}

总结

  • 浮点数适用于科学计算或无需高精度的场景。
  • 精确计算(如货币)建议使用整数(如分单位)或DECIMAL类型(数据库中)。
  • 始终警惕精度误差,合理选择比较方法和运算库。

七,布尔型数据

一、布尔型的基本概念

布尔型(Boolean)是PHP中最简单的数据类型,只有两个可能的值:

  • true(逻辑真)
  • false(逻辑假)

布尔型通常用于条件判断(如 ifwhile 语句)中控制程序流程。¥val


二、定义布尔值

1. 直接赋值
$isTrue = true;
$isFalse = false;
2. 不区分大小写的常量

PHP中布尔常量不区分大小写,但推荐使用小写以保持代码规范:

$a = TRUE;   // 有效,但建议使用小写
$b = False;  // 有效

三、布尔转换规则

PHP是弱类型语言,其他类型值在需要时会自动转换为布尔值。以下是转换规则:

1. 视为 false 的值

以下值在转换为布尔型时会被认为是 false

  • 整型 0、浮点型 0.0
  • 空字符串 "" 和字符串 "0"
  • 空数组 []array()
  • null
  • 特殊对象(如空SimpleXMLElement对象)
2. 视为 true 的值

其他所有值均被视为 true,包括:

  • 非零数字(如 1, -1, 3.14
  • 非空字符串(如 "false"" "
  • 非空数组(如 [0]
  • 资源(Resource)类型
  • 所有对象(即使是空对象)

四、类型检测与转换

1. 检测布尔类型

使用 is_bool() 函数:

var_dump(is_bool(true));   // 输出 bool(true)
var_dump(is_bool("true")); // 输出 bool(false)
2. 显式转换

通过强制类型转换或函数:

$value = (bool) "Hello";    // 转为 true
$value = boolval(0);        // 转为 false

五、布尔型在条件判断中的应用

在控制结构中,表达式会自动转换为布尔值

if ("0") {          // 字符串 "0" 转换为 falseecho "会执行吗?";
} else {echo "这里会被执行!";
}// 输出:这里会被执行!

六、常见陷阱与注意事项

1. 字符串 "0" 的特殊性
$str = "0";
var_dump((bool)$str); // 输出 bool(false)
2. 非空数组的转换
$arr = [0];
var_dump((bool)$arr); // 输出 bool(true)
3. 对象始终为 true
$obj = new stdClass();
var_dump((bool)$obj); // 输出 bool(true)
4. 布尔值与字符串拼接
echo "结果为:" . true;  // 输出 "结果为:1"
echo "结果为:" . false; // 输出 "结果为:"

七、最佳实践

  1. 显式比较
    避免依赖隐式转换,使用严格比较(===):

    if ($value === true) {// 明确检查布尔值
    }
    
  2. 处理表单/外部输入
    从表单或数据库获取的数据需显式转换:

    $isActive = (bool)$_POST['is_active'];
    
  3. 高可读性代码
    避免直接使用 if ($var),明确条件含义:

    // 不推荐
    if ($user) { ... }// 推荐
    if ($user !== null) { ... }
    

八、示例代码

// 布尔值的定义与转换
$value1 = 0;
$value2 = "Hello";var_dump((bool)$value1); // bool(false)
var_dump((bool)$value2); // bool(true)// 条件判断中的自动转换
if ([]) {echo "空数组为真?";
} else {echo "空数组为假!"; // 输出此句
}// 严格类型检查
$flag = "true";
if ($flag === true) {echo "严格模式不会执行!";
}

总结

  • 布尔型用于表示逻辑真/假,是条件判断的核心。
  • 理解隐式转换规则可避免逻辑错误。
  • 在关键场景中使用显式转换和严格比较(===)以提高代码健壮性。

八,运算符

一、算术运算符

用于数学计算,支持数值类型操作:

$a = 10;
$b = 3;echo $a + $b;   // 13(加法)
echo $a - $b;   // 7(减法)
echo $a * $b;   // 30(乘法)
echo $a / $b;   // 3.333...(除法)
echo $a % $b;   // 1(取模,余数符号与被除数一致)
echo $a ** $b;  // 1000(幂运算,PHP 5.6+)

注意:除法 / 总是返回浮点数(除非能整除)。


二、比较运算符

用于值比较,返回布尔值 truefalse

运算符名称示例说明
==松散等于5 == "5"true值相等,忽略类型
===严格等于5 === "5"false值和类型均相等
!=松散不等于5 != "5"false值不相等
<>松散不等于!=
!==严格不等于5 !== "5"true值或类型不同
<小于3 < 5true
>大于3 > 5false
<=小于等于5 <= 5true
>=大于等于5 >= 3true
<=>太空船运算符5 <=> 31PHP7+,返回-1,0,1表示比较结果

三、逻辑运算符

用于组合条件,支持短路求值:

运算符名称示例说明
&&逻辑与$a && $b两者为真则真,优先级高于 and
|逻辑或$a || $b任一为真则真,优先级高于 or
!逻辑非!$a取反
and逻辑与$a and $b功能同 &&,但优先级更低
or逻辑或$a or $b功能同 ||,优先级更低
xor逻辑异或$a xor $b仅一真则真,否则假

注意

  • &&|| 优先级高于 andor,可能导致逻辑错误:

    $result = false && true;  // → false(等价于 (false) && true)
    $result = false and true; // → false(等价于 ($result = false) and true)
    
  • 短路求值:若左操作数已确定结果,右操作数不执行:

    false && expensiveFunction(); // 不会调用函数
    

四、位运算符

对整数的二进制位进行操作:

运算符名称示例说明
&按位与5 & 31二进制位同为1则结果位为1
|按位或5 | 37任一二进制位为1则结果位为1
^按位异或5 ^ 36二进制位不同则结果位为1
~按位取反~5-60变1,1变0(结果依赖整数位数)
<<左移5 << 110左移指定位数,右侧补0
>>右移5 >> 12右移指定位数,左侧补符号位

应用场景:权限控制、标志位处理。

计算机码的基本概念

计算机存储数据时通常采用 定长二进制,尤其是整数。负数的表示方式一般有三种主要编码方式:

  1. 原码(Sign-Magnitude Representation)

    • 最高位(最左侧)作为符号位:0 表示正数,1 表示负数。
    • 剩余部分表示数值的绝对值。
    • 缺点:正负零的表示不同,且计算复杂。

    示例(8位存储)

    • +500000101
    • -510000101
  2. 反码(One’s Complement)

    • 正数的表示与原码相同。
    • 负数的表示是对原码的数值部分按位取反(0 变 1,1 变 0)。
    • 存在两个零 (+0-0),仍然不便于计算。

    示例(8位存储)

    • +500000101
    • -511111010(取反)
  3. 补码(Two’s Complement,计算机中最常用的表示方式)

    • 正数的表示与原码相同。
    • 负数的表示是反码 + 1(取反后加 1)。
    • 补码的优点:
      • 计算更方便(加减法可直接使用二进制加法)。
      • 只有一种零表示方式 (00000000)。

    示例(8位存储)

    • +500000101
    • -511111011(先取反 11111010,再加 1

五、赋值运算符

为变量赋值,支持组合操作:

运算符示例等价于
=$a = 5直接赋值
+=$a += 3$a = $a + 3
-=$a -= 2$a = $a - 2
*=$a *= 4$a = $a * 4
/=$a /= 2$a = $a / 2
%=$a %= 3$a = $a % 3
.=$a .= "str"$a = $a . "str"(字符串拼接)

六、字符串运算符

仅有两个运算符,用于字符串操作:

  1. .(连接):

    $str1 = "Hello";
    $str2 = "World";
    echo $str1 . " " . $str2; // "Hello World"
    
  2. .=(连接赋值):

    $str = "Hello";
    $str .= " World"; // $str 变为 "Hello World"
    

七、数组运算符

用于数组比较和合并:

运算符名称示例说明
+联合$a + $b合并数组,保留左侧键名,忽略右侧重复键
==松散相等[1, 2] == ["1", 2]true键值对相同,忽略键类型和顺序
===严格相等[1, 2] === [2, 1]false键值对、顺序、类型均相同
!=松散不等== 结果相反
!==严格不等=== 结果相反

示例

$a = ["a" => 1, "b" => 2];
$b = ["b" => 3, "c" => 4];
print_r($a + $b); // ["a"=>1, "b"=>2, "c"=>4]

八、类型运算符

  1. instanceof
    检查对象是否属于某个类或接口:

    class MyClass {}
    $obj = new MyClass();
    var_dump($obj instanceof MyClass); // true
    

九、执行运算符

  1. 反引号 ```
    执行系统命令并返回输出:

    $output = `ls -al`; // 类似 shell_exec()
    echo $output;
    

十、错误控制运算符

  1. @
    抑制表达式可能产生的错误:

    $file = @file('non_existent.txt'); // 不显示错误信息
    

    注意:滥用可能导致调试困难,建议使用异常处理替代。


十一、自操作运算符

修改变量值的快捷操作:

运算符名称示例说明
++$a前递增$a = 5; echo ++$a; → 6先加1,后返回值
$a++后递增$a = 5; echo $a++; → 5先返回值,后加1
--$a前递减$a = 5; echo --$a; → 4先减1,后返回值
$a--后递减$a = 5; echo $a--; → 5先返回值,后减1
1. 自增和自减运算符

基本概念

  • 自增运算符(++):用于将变量的值增加 1。
  • 自减运算符(–):用于将变量的值减少 1。

这两种运算符又分为两种形式:

  • 前置形式
    写法: ++$var--$var
    特点:先对变量进行加减操作,然后再使用变量的新值。例如:

    php复制编辑<?php
    $a = 5;
    $b = ++$a;  // $a 先自增变为6,再将6赋给 $b
    echo $a; // 输出 6
    echo $b; // 输出 6
    ?>
    
  • 后置形式
    写法: $var++$var--
    特点:先使用变量原来的值,然后再进行加减操作。例如:

    <?php
    $a = 5;
    $b = $a++;  // $b 先接收$a的值5,然后$a自增变为6
    echo $a; // 输出 6
    echo $b; // 输出 5
    ?>
    

使用注意

  • 表达式求值顺序
    在复杂表达式中混合使用前置和后置运算符时,需要特别注意求值顺序,以免造成难以预料的结果。例如,避免在同一表达式中对同一变量进行多次自增或自减操作。
  • 代码可读性
    尽量避免过度复杂的自操作运算符嵌套,以保证代码的可读性和易于维护。
2. 复合赋值运算符

除了自增自减之外,PHP 还提供了复合赋值运算符,这类运算符结合了运算和赋值操作,常用的有:

  • 加法赋值运算符 +=
    例如:$a += 5; 等价于 $a = $a + 5;
  • 减法赋值运算符 -=
    例如:$a -= 3; 等价于 $a = $a - 3;
  • 乘法赋值运算符 *=
    例如:$a *= 2; 等价于 $a = $a * 2;
  • 除法赋值运算符 /=
    例如:$a /= 4; 等价于 $a = $a / 4;

这类运算符可以减少代码的冗余,增强代码的简洁性。

3. 实际应用场景
  • 循环计数
    自增和自减运算符在循环中非常常见,例如 for 循环:

    <?php
    for ($i = 0; $i < 10; $i++) {echo $i . " ";
    }
    ?>
    
  • 统计计数
    用于统计出现次数、迭代数组或对象时更新计数器。

  • 复合运算
    复合赋值运算符常用于累加、累减、乘积等场景,能让代码更加紧凑。


十二、三元运算符

1.基本语法
$result = (条件) ? 表达式1 : 表达式2;
  • 条件:一个布尔表达式。
  • 表达式1:当条件为真(true)时执行或返回的值。
  • 表达式2:当条件为假(false)时执行或返回的值。
<?php
$a = 10;
$b = 20;
$result = ($a > $b) ? "a大于b" : "a不大于b";
echo $result; // 输出 "a不大于b"
?>

在上面的代码中,如果 $a > $b 为真,则 $result 将被赋值为 “a大于b”;否则为 “a不大于b”。

2. 嵌套使用

当需要根据多个条件进行判断时,可以将三元运算符嵌套使用。但要注意,由于三元运算符是右结合(right-associative)的,建议使用括号明确表达顺序,避免产生歧义。例如:

<?php
$score = 75;
$result = ($score >= 90) ? "优秀" : (($score >= 60) ? "及格" : "不及格");
echo $result; // 输出 "及格"
?>

这种写法先判断 $score >= 90,如果不满足,再判断 $score >= 60,依次返回对应的结果。


3. 简化写法:短路求值

PHP 还支持一种简写形式,当你想要检查一个变量是否“真”并直接使用该变量时,可以使用“?:”运算符。其语法为:

$result = $var ?: $default;

这个表达式等同于:

$result = $var ? $var : $default;

$var 的值被认为是真(非空、非零等)时,结果就是 $var;否则返回 $default。例如:

<?php
$username = "";
$displayName = $username ?: "匿名用户";
echo $displayName; // 输出 "匿名用户"
?>

十三、运算符优先级

运算符按优先级从高到低执行,部分常见优先级如下(完整列表见PHP文档):

  1. clonenew
  2. **
  3. ++--~(int)等类型转换
  4. !
  5. */%
  6. +-.
  7. <<=>>=
  8. =====!=!==<><=>
  9. &&||andorxor
  10. ?:??
  11. =+=.=等赋值运算符

建议:使用括号明确优先级,避免依赖记忆。


十四、实用技巧与陷阱

  1. 优先级陷阱

    echo 1 + 2 * 3;   // 7(乘法优先级高于加法)
    echo (1 + 2) * 3; // 9
    
  2. 类型转换问题

    var_dump(0 == "a");     // true(字符串"a"转为0)
    var_dump("123" == 123); // true(字符串转数字)
    
  3. 严格比较
    使用 ===!== 避免类型转换导致的意外结果。


相关文章:

PHP语法基础

PHP语法基础 一&#xff0c;变量 在PHP中&#xff0c;变量是存储数据的容器&#xff0c;其灵活性和动态类型系统是PHP的核心特性之一。以下是PHP变量的详细解析&#xff0c;涵盖声明、作用域、类型转换及最佳实践&#xff1a; 1. 变量基础 声明与命名规则 无需显式声明类型&…...

嵌入式硬件: GPIO与二极管基础知识详解

1. 前言 在嵌入式系统和硬件开发中&#xff0c;GPIO&#xff08;通用输入输出&#xff09;是至关重要的控制方式&#xff0c;而二极管作为基础电子元件&#xff0c;广泛应用于信号整流、保护电路等。本文将从基础原理出发&#xff0c;深入解析GPIO的输入输出模式&#xff0c;包…...

母婴商城系统Springboot设计与实现

项目概述 《母婴商城系统Springboot》是一款基于Springboot框架开发的母婴类电商平台&#xff0c;旨在为母婴产品提供高效、便捷的在线购物体验。该系统功能全面&#xff0c;涵盖用户管理、商品分类、商品信息、商品资讯等核心模块&#xff0c;适合母婴电商企业或个人开发者快…...

Redis相关面试题

以下是150道Redis相关面试题&#xff1a; Redis基础概念 1. Redis是什么&#xff1f; Redis是一个开源的、基于内存的高性能键值存储数据库&#xff0c;常用于缓存、消息队列等场景。 2. Redis的特点有哪些&#xff1f; • 高性能&#xff0c;读写速度快。 • 支持多种数据…...

ArcGIS助力水文分析:数据处理、地图制作与流域特征提取

在水文水环境保护中&#xff0c;对于信息的采集、处理和分析是关键步骤。水文水环境及其相关数据均具有空间分布特征&#xff0c;传统的方法难以发挥作用。地理信息系统&#xff08;GIS&#xff09;强大的空间数据管理和分析功能&#xff0c;在空间信息处理上有独到的优势&…...

docker桌面版启动redis,解决无法连接

docker run -d --name redis -p 6379:6379 -v E:\2\redis\redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/etc/redis/redis.conf 在本地创建一个目录&#xff0c;里面有个redis.conf文件&#xff0c;内容如下&#xff0c;启动时绑定这个配置文件目…...

Vue 项目中 CDN 引入的利弊及解决方案

在Vue项目中&#xff0c;引入到工程中的所有js、css文件&#xff0c;编译时都会被打包进vendor.js&#xff0c;浏览器在加载该文件之后才能开始显示首屏。若是引入的库众多&#xff0c;那么vendor.js文件体积将会相当的大&#xff0c;影响首屏的体验。通过调试发送时间主要消耗…...

【QT】】qcustomplot的使用

1.下载并添加qcustomplot.c和qcustomplot.h文件 拖动一个Widget&#xff0c;提升为qcustomplot 成功后是这样的&#xff0c; 改第三行&#xff1a;greaterThan(QT_MAJOR_VERSION, 4): QT widgets printsupport 编译&#xff0c;不报错&#xff0c;出现带坐标轴的界面&#…...

第三周日志-web(2)

原本计划的web不是这个&#xff0c;但是b站上一个大佬讲web做到了连我都能听懂&#xff0c;不趁热打铁学一学记一记就怕忘记了 指路&#xff1a;Shiro反序列化漏洞(一)-shiro550流程分析_哔哩哔哩_bilibili khttps://www.zhihu.com/question/486555909 学模板先看看结构和功…...

KICK第四讲Linux 系统下安装 GCC 编译器全指南

Linux 系统下安装 GCC 编译器全指南 GCC&#xff08;GNU Compiler Collection&#xff09;是 Linux 系统下最常用的编译器之一&#xff0c;支持 C/C、Java 等多种编程语言。本文将介绍不同 Linux 发行版下的安装方法&#xff0c;帮助开发者快速配置开发环境。 一、使用包管理…...

SpringCloud 学习笔记1(Spring概述、工程搭建、注册中心、负载均衡、 SpringCloud LoadBalancer)

文章目录 SpringCloudSpringCloud 概述集群和分布式集群和分布式的区别和联系 微服务什么是微服务&#xff1f;分布式架构和微服务架构的区别微服务的优缺点&#xff1f;拆分微服务原则 什么是 SpringCloud &#xff1f;核心功能与组件 工程搭建父项目的 pom 文件 注册中心Rest…...

go 安装swagger

1、依赖安装&#xff1a; # 安装 swag 命令行工具 go install github.com/swaggo/swag/cmd/swaglatest# 安装 gin-swagger 和 swagger 文件的依赖 go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files 2、测试 cmd中输入&#xff1a; swag -v 如果…...

Java中关于Optional的 orElse 操作,以及 orElse 与 orElseGet 的区别

文章目录 1. 大概说明2. 详细分析2.1 .orElse 操作2.2 .orElse 的作用&#xff1a;避免空指针异常2.3 为什么要用&#xff1f;2.4 orElseGet如何使用2.5 orElse和orElseGet的区别 1. 大概说明 这篇文章的目的是为了说明&#xff1a; orElse 如何使用orElseGet 如何使用两者的…...

Sqlmap注入工具简单解释

安装 1. 安装 Python SQLMap 是基于 Python 开发的&#xff0c;所以要先安装 Python 环境。建议安装 Python 3.9 或更高版本&#xff0c;可从 Python 官方网站 下载对应操作系统的安装包&#xff0c;然后按照安装向导完成安装。 2. 获取 SQLMap 可以从 SQLMap 的官方 GitHu…...

petalinxu 在zynq的FPGA下的ST7735S的驱动配置

spi的接线&#xff1a; 【TFT模块排针8】 【开发板spi,gpio】【antminers9】 VCC ----------- 3.3V ----------- 3.3V GND ----------- GND ----------- GND BLK(背光&#xff09;-------GPIO----------- BANK34_L4N_RXD2(w13; j2.12; gpio[2]) RST(复位&#xff…...

数据篇| App爬虫入门(一)

App 的爬取相比 Web 端爬取更加容易,反爬虫能力没有那么强,而且数据大多是以 JSON 形式传输的,解析更加简单。在 Web 端,我们可以通过浏览器的开发者工具监听到各个网络请求和响应过程,在 App 端如果想要查看这些内容就需要借助抓包软件。常见抓包软件有: ‌工具名称‌‌…...

【6】拓扑排序学习笔记

前言 有向无环图和拓扑排序直接关联到中后期的图论建模思想&#xff0c;是很重要的基础知识。这个如果不彻底弄懂&#xff0c;以后图论会很困难。 有向无环图 正如其名&#xff0c;一个边有向&#xff0c;没有环的图&#xff0c;也叫DAG。 DAG图实际运用&#xff1a;描述含…...

OpenCV实现图像特征提取与匹配

‌一、特征检测与描述子提取‌ ‌选择特征检测器‌ 常用算法包括&#xff1a; ‌ORB‌&#xff1a;一种高效的替代SIFT和SURF的算法&#xff0c;主要用于移动机器人和增强现实等领域。适合实时应用&#xff0c;结合FAST关键点与BRIEF描述子‌。‌SIFT&#xff08;尺度不变特征变…...

MyBatis 的核心配置文件是干什么的? 它的结构是怎样的? 哪些是必须配置的,哪些是可选的?

MyBatis 的核心配置文件&#xff08;通常命名为 mybatis-config.xml&#xff09;是 MyBatis 应用程序的入口点&#xff0c;它定义了 MyBatis 的全局配置信息 。 核心配置文件的作用&#xff1a; 配置 MyBatis 的运行时行为: 通过 <settings> 标签设置全局参数&#xff…...

VLAN,DHCP实验访问物理机

目标 三层交换机完成DHCP自动分配IP地址不同vlan间完成通信DNS服务器能够解析www.baidu.com&#xff0c;使PC机能够访问连接真实物理机&#xff0c;PC机与物理机能够互相访问 步骤 一、创建VLAN&#xff0c;配置好PC机和交换机的IP地址 LSW1 [LSW1]vlan batch 10 20 Info: T…...

六十天前端强化训练之第十七天React Hooks 入门:useState 深度解析

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、知识讲解 1. Hooks 是什么&#xff1f; 2. useState 的作用 3. 基本语法解析 4. 工作原理 5. 参数详解 a) 初始值设置方式 b) 更新函数特性 6. 注意事项 7. 类组…...

解决 HTTP 请求中的编码问题:从乱码到正确传输

文章目录 解决 HTTP 请求中的编码问题&#xff1a;从乱码到正确传输1. **问题背景**2. **乱码问题的原因**2.1 **客户端编码问题**2.2 **请求头缺失**2.3 **服务器编码问题** 3. **解决方案**3.1 **明确指定请求体编码**3.2 **确保请求头正确**3.3 **动态获取响应编码** 4. **调…...

跨国企业网络案例分析:SD-WAN智能组网

跨国企业面临的网络问题日益增加&#xff0c;如全球供应链协同、跨国研发协作及实时生产数据传输等场景&#xff0c;对网络质量提出更高要求。本文将深度解析某跨国工业集团如何通过SD-WAN实现网络架构智能化转型。 该集团以上海全球总部为核心&#xff0c;构建了覆盖亚欧美三大…...

视频孪生与三维视频融合:重构工业现场的“数字视网膜“

在浙江某精密制造企业的总控中心&#xff0c;30米长的曲面屏上实时跳动着工厂的每个生产细节&#xff1a;机械臂的运动轨迹与数字模型完全同步&#xff0c;质检工位的操作误差被自动标记&#xff0c;AGV小车的行进路径在三维空间中以光带形式可视化呈现。这种虚实交融的场景并非…...

STM32Cubemx-H7-7-OLED屏幕

如何把江科大的OLED标准库文件换成hal库的文件 前言 本文讲解如在hHAL库中使用OLED&#xff0c;其实江科大做的文件好已经很好了 只讲操作&#xff0c;不讲废话&#xff0c;默认大家都有32基本操作 创建工程 首先创建工程 把那两个引脚设置成开漏 获取标准库文件 打开江科大O…...

FPGA为何要尽量减少组合逻辑的使用

在FPGA设计中&#xff0c;组合逻辑的使用确实需要谨慎&#xff0c;尤其是要尽量减少它的复杂性。这并不是因为组合逻辑本身不好&#xff0c;而是因为它在实际应用中容易引发一系列问题&#xff0c;而这些问题往往与FPGA的设计哲学和硬件特性相冲突。让我从几个关键点来和你聊聊…...

缓存使用的具体场景有哪些?缓存的一致性问题如何解决?缓存使用常见问题有哪些?

缓存使用场景、一致性及常见问题解析 一、缓存的核心使用场景 1. 高频读、低频写场景 典型场景&#xff1a;商品详情页、新闻资讯、用户基本信息。特点&#xff1a;数据更新频率低&#xff0c;但访问量极高。策略&#xff1a; Cache-Aside&#xff08;旁路缓存&#xff09;&a…...

基于 RWA 模型与 AI - Agent 协同的企业级 aPAAS 架构设计

一、引言 在企业数字化转型不断深化的当下&#xff0c;现实世界资产&#xff08;RWA&#xff09;模型与人工智能智能体&#xff08;AI - Agent&#xff09;的协同融合&#xff0c;为企业级应用平台即服务&#xff08;aPAAS&#xff09;架构的创新发展带来了新契机。这种架构旨在…...

基于“动手学强化学习”的知识点(一):第 14 章 SAC 算法(gym版本 >= 0.26)

第 14 章 SAC 算法&#xff08;gym版本 &#xff1e; 0.26&#xff09; 摘要SAC 算法&#xff08;连续&#xff09;SAC 算法&#xff08;离散&#xff09; 摘要 本系列知识点讲解基于动手学强化学习中的内容进行详细的疑难点分析&#xff01;具体内容请阅读动手学强化学习&…...

【QT:信号和槽】

QT信号涉及的三要素&#xff1a;信号源、信号类型、信号的处理方式。 QT的信号槽机制&#xff1a; 给按钮的点击操作关联一个处理函数&#xff0c;用户点击按钮时触发&#xff0c;对应的处理函数就会执行 QT中使用connect函数将信号和槽关联起来&#xff0c;信号触发&#xf…...

Oracle中的INHERIT PRIVILEGES权限

Oracle中的INHERIT PRIVILEGES权限 存储过程和用户函数的AUTHID属性调用者权限vs定义者权限一个简单的示例INHERIT PRIVILEGES权限的含义INHERIT PRIVILEGES权限的安全隐患注意到Oracle 19c数据库中有如下权限信息: SQL> select grantor,grantee,table_name,privilege fro…...

Compose笔记(九)--Checkbox

这一节主要了解一下Compose中的Checkbox&#xff0c;它是Jetpack Compose UI框架中的一个组件&#xff0c;用于创建复选框功能。它允许用户从一个集合中选择一个或多个项目&#xff0c;可以将一个选项打开或关闭。与传统的Android View系统中的Checkbox相比&#xff0c;Compose…...

CSS中粘性定位

1.如何设置为粘性定位? 给元素设置posttion:sticky 即可实现粘性定位. 可以使用left, right ,top, bottom 四个属性调整位置,不过最常用的是top 值. 2.粘性定位的参考点在哪里? 离他最近的一个拥有"滚动机制"的祖先元素,即便这个祖先不是最近的真实可滚动祖先. 3.粘…...

日本IT|AWS工作内容及未来性、以及转职的所需资质和技能

AWSとは AWSはAmazon Web Services&#xff08;アマゾンウェブサービス&#xff09;の略称です。 名称から分かるとおり、ネットを通じた通販などを事業として行っているAmazon.com社がクラウドサービスとして運営しています。 本来であれば自分たちでインフラ環境を構築する…...

《Spring日志整合与注入技术:从入门到精通》

1.Spring与日志框架的整合 1.Spring与日志框架进行整合&#xff0c;日志框架就可以在控制台中&#xff0c;输出Spring框架运行过程中的一些重要的信息。 好处&#xff1a;方便了解Spring框架的运行过程&#xff0c;利于程序的调试。 Spring如何整合日志框架 Spring5.x整合log4j…...

如何判断一个项目用的是哪个管理器

如何判断一个项目用的是哪个管理器 npm: 如果项目中存在 package-lock.json 文件&#xff0c;这通常意味着项目使用 npm 作为包管理器。package-lock.json 文件会锁定项目的依赖版本&#xff0c;确保在不同环境中安装相同的依赖。 pnpm: 如果项目中存在 pnpm-lock.yaml 文件&a…...

软件工程概述

软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析&#xff0c;任务是确定软件开发的总目标。 问题定义可行性研究&#xff08;经济、技术、操作、社会可行性&#xff0c;确定问题和解决办法&#xff09;需求分析&#xff08;确定功能需求&#xff0c;性…...

文件系统 linux ─── 第19课

前面博客讲解的是内存级文件管理,接下来介绍磁盘级文件管理 文件系统分为两部分 内存级文件系统 : OS加载进程 ,进程打开文件, OS为文件创建struct file 和文件描述符表 ,将进程与打开的文件相连, struct file 内还函数有指针表, 屏蔽了底层操作的差异,struct file中还有内核级…...

一篇博客搞定时间复杂度

时间复杂度 1、什么是时间复杂度&#xff1f;2、推导大O的规则3、时间复杂度的计算3.1 基础题 13.2 基础题 23.3基础题 33.4进阶题 13.5进阶题 23.6 偏难题 13.7偏难题 2&#xff08;递归&#xff09; 前言&#xff1a; 算法在编写成可执行程序后&#xff0c;运行时要耗费时间和…...

微信小程序实现根据不同的用户角色显示不同的tabbar并且可以完整的切换tabbar

直接上图上代码吧 // login/login.js const app getApp() Page({/*** 页面的初始数据*/data: {},/*** 生命周期函数--监听页面加载*/onLoad(options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady() {},/*** 生命周期函数--监听页面显示*/onShow() {},/*** 生命周期函…...

S_on@atwk的意思

S_onatwk 可能是某种自动化或控制系统中的符号或标记&#xff0c;尤其在PLC&#xff08;可编程逻辑控制器&#xff09;编程中&#xff0c;类似的表达方式通常用于表示特定的信号、状态或操作。 我们可以分析这个表达式的各个部分&#xff1a; S_on&#xff1a;通常&#xff0…...

Liunx启动kafka并解决kafka时不时挂掉的问题

kafka启动步骤 先启动zookeeper&#xff0c;启动命令如下 nohup ./zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties > /home/kafka/kafka/zookeeper.log 2>&1 &再启动kafka&#xff0c;启动命令如下 nohup ./kafka-server-start.sh…...

16 | 实现简洁架构的 Store 层

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…...

华为hcia——Datacom实验指南——以太网帧和IPV4数据包格式(一)

实验开始 第一步配置环境 第二步配置客户端 如图所示&#xff0c;我们把客户端的ip配置成192.168.1.10&#xff0c;网关设为192.168.1.1 第三步配置交换机1 system-view sysname LSW1 vlan batch 10 interface ethernet0/0/1 port link-type access port default vlan 10 qu…...

ubuntu软件——视频、截图、图片、菜单自定义等

视频软件&#xff0c;大部分的编码都能适应 sudo apt install vlc图片软件 sudo apt install gwenview截图软件 sudo apt install flameshot设置快捷键 flameshot flameshot gui -p /home/cyun/Pictures/flameshot也就是把它保存到一个自定义的路径 菜单更换 sudo apt r…...

CSS中z-index使用详情

定位层级 1.定位元素的显示层级比普通元素高,无论什么定位,显示层级都是一样的; 2.如果位置发生重叠,默认情况是:后面的元素,会显示在前面元素之上; 3.可以通过CSS属性z-index调整元素的显示层级; 4.z-index的属性值是数字,没有单位,值越大显示层级越高; 5.只有定位的元素…...

qt 自带虚拟键盘的编译使用记录

一、windows 下编译 使用vs 命令窗口&#xff0c;分别执行&#xff1a; qmake CONFIG"lang-en_GB lang-zh_CN" nmake nmake install 如果事先没有 指定需要使用的输入法语言就进行过编译&#xff0c;则需要先 执行 nmake distclean 清理后执行 qmake 才能生效。 …...

杨辉三角形(信息学奥赛一本通-2043)

【题目描述】 例5.11 打印杨辉三角形的前n(2≤n≤20)行。杨辉三角形如下图&#xff1a; 当n5时 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 输出&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 【输入】 输入行数n。 【输出】 输出如题述三角形。n行&#…...

CentOS 7 系统上安装 SQLite

1. 检查系统更新 在安装新软件之前&#xff0c;建议先更新系统的软件包列表&#xff0c;以确保使用的是最新的软件源和补丁。打开终端&#xff0c;执行以下命令&#xff1a; sudo yum update -y -y 选项表示在更新过程中自动回答 “yes”&#xff0c;避免手动确认。 2. 安装 …...

程序化广告行业(13/89):DSP的深入解析与运营要点

程序化广告行业&#xff08;13/89&#xff09;&#xff1a;DSP的深入解析与运营要点 大家好&#xff01;一直以来&#xff0c;我都对程序化广告行业保持着浓厚的学习兴趣&#xff0c;在探索的过程中积累了不少心得。今天就想把这些知识分享出来&#xff0c;和大家一起学习进步…...