PHP Manual
/
变量

PHP中的变量

22. 08. 2019

Obsah článku

本页是对变量在PHP中如何工作的完整总结。该文本以略带技术性的风格编写,初学者可能无法完全理解。如果你对完整的基础知识感兴趣,那么请阅读初学者教程编写变量的原则

描述

变量是运行内存中的一个虚拟位置,它由名称'和数据类型'定义。在数据类型中,变量就有一些`内容'。

在内部,PHP将变量表示为一个所谓的哈希表,即所有的变量都存储在一个搜索速度非常快的表中,所以访问每个变量所需的时间几乎是**不变的。

写作实例。

$a = 10;
$b = '猫';
$c = true;

样本中的每一行表示一个变量的定义。每个变量的名称以美元符号$开头,后面是名称本身。等号可以用来给变量赋值。

在内部,这些变量将以哈希表的形式存储在内存中。

名称 类型 缩写
$a 整数 int 10
$b 字符串 字符串 cats
$c boolean bool true !

变量类型

变量根据访问权限和使用情况进行分类。

  • 局部变量(在上下文中有效,即在函数和方法中)。
  • global variables(在整个脚本中有效)。
  • Superglobal变量(在整个服务器环境中有效--通常是用户数据)。
  • 变量(一个特殊的变量,包含对另一个变量的引用(链接))。
  • 不应使用 "全局变量 "和 "变量",因为它们会造成代码的不可读性和 "神奇"(意外)的应用行为。

变量的允许内容

变量可以包含其当前数据类型所允许的任何内容。如果没有指定数据类型,它将根据内容自动确定(不建议这样做,因为它可能导致错误)。

数据类型是独立工作的,所以我们几乎可以使用任何类型。然而,如果我们想进行一些合并操作,我们必须始终确保转换为一种格式。

一个很好的例子是,例如数字的加法和乘法。

$x = 5; // 整数
$y = 3; // 整数
$z = $y + $y; // 变量$z将根据多个变量组成。

在这种情况下,PHP面临的问题是新创建的变量$z将具有什么数据类型。如果它们是相同的数据类型,并且操作是可能的,那么数据类型就被继承了。

然而,有时我们可以用多种数据类型来执行一个操作。

$x = 1; // 整数
$y = 3.14159; // 浮动
$z = $y + $y; // 浮动

在这种情况下,我们将整数和浮点数合并。输出将是一个十进制的数字,所以使用float。在这种情况下,PHP会做一个叫做**动态重新分区的事情。

然而,我们不能总是依赖这种行为。例如,你想如何合并一个数字和一个字符串?

$x = 256; // 整数
$y = '嘿,嘿!'; // 浮动
$z = $y + $y; // ???

数据类型(最重要的类型概述)

PHP是一种解释型语言,所以与其他编程语言相比,它有一些特殊性,其中之一是我们不必为变量指定数据类型,即每个变量根据其内容动态地改变其数据类型(除非另有说明)。不过,至少知道基本的数据类型是很好的,在优化应用程序或与数据库一起工作时尤其有用。

符号可以看起来像这样。

$x = (int) 25; //创建一个整数类型的变量

数据类型概述

数据类型的继承

如果我们只知道这段源代码,那么变量$x会有什么数据类型?

$x = $y;

它取决于变量$y的数据类型,其值和数据类型都将被继承。在这种情况下,我们不知道变量$x,所以我们不能继续评估代码,并且会抛出一个错误信息。

动态覆盖

让我们有以下2个变量。

$x = 10;
$y = '10';

变量$x$y的内容有什么不同?

变量$x是一个数字,$y是一个字符串(包含一个 "1 "和一个 "0"),所以如果我们只是将变量存储在内存中,不进行任何操作,会影响数值。例如,以下2个条目将返回相同的结果。

echo $x + 5; //打印出15
echo $y + 5; //打印出15

在第二种情况下,发生了所谓的动态覆盖,也就是说,变量转换了它的数据类型,这样就可以对它进行计算操作。这种行为不能总是被依赖,更多的是一种纠正行为,以修复写得不好的初级脚本。如果可能的话,总是用数据类型来存储数字,因为这样可以提高数字的精度,使它们在将来更容易使用。

**注意:**需要注意的是,我们不能完全任意地转换数据类型,所以这并不总是可能的。如果你把一个数据类型覆盖到其他(不兼容)的数据类型,要么转换可能根本没有发生,要么原来的内容可能被破坏或完全被破坏,并被另一个类型所取代。例如,如果你把一个字符串改写成一个整数(并且一些不是数字的文本被存储在变量中),那么值1将被存储在变量中,而不是数字值。

将字符串表示为数组

所有的字符串在内部都是作为一个字符数组来存储的。也就是说,每个字符都有自己的索引,可以被引用。如果我们不指定一个索引,整个字符串就会被处理。

$x = '让我们用PHP编程吧!';
$n = 3;
echo $x; // 这将打印出$x变量的全部内容。
echo $x[0]; // 这将打印出$x变量的空字符。
echo $x[$n]; // 这将打印出$x变量的第n个字符。

**注意:**PHP数字从零开始,即零字符是'P',第一个字符是'r'。

此外,字符是由字节转换的。例如,UTF-8编码中的字符 "no "有2个字节长,因此在滚动时,字符串中的字符索引将与实际位置不匹配,将使用2个索引来存储该字符。

一个数组元素的存在应该总是用isset()函数来验证。

if (isset($x[$n])) {
echo $x[$n];
}

另外,你也可以用三元运算符很好地写下来。

echo $x[$n] ?? '';

复制变量

让我们有以下变量。

$q = 'Lorem ipsum, ...';

然后将其值复制到下一个变量。

$qi = $q;

幸运的是,不会进行复制,PHP将只是在一个哈希表中存储一个对数值的引用。只有当其中一个变量的值应该改变时,该值才会被实际复制。这种行为由一个通常称为桥收集器的组件处理。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024