文章目录
- PHP变量和常量(基础语法)
- 简介
- 变量
- 常量
- PHP中的变量
- 变量基础
- 全局变量
- 超全局变量
- 静态变量
- PHP常量基础
- 总结
PHP变量和常量(基础语法)
简介
变量和常量是编程语言中不可或缺的元素,它们类似于盒子,用于存储和操作数据。这两个概念对于编写可读性强、可维护性高的代码非常关键。
变量
变量是一种存储数据的容器,我们可以为变量命名并将数据赋值给它。通过变量,我们可以在程序中保存和操作各种类型的数据,如数字、字符串或对象等。变量的值可以在程序执行过程中随时更改。
在编程中,变量的命名应具有描述性和易读性,以便提高代码的可维护性。通过赋值操作符将数据分配给变量,例如$name = "John";
将字符串"John"赋值给变量$name。在需要使用这个值时,只需引用该变量即可,而无需直接操作数据本身,这样代码更具可读性。
常量
常量也是一种存储数据的容器,与变量不同的是,常量的值在定义后无法更改。常量一旦定义就始终保持不变,这使得在程序中使用恒定的值更加安全和可靠。
常量通常用于存储程序中不会变化的固定值,如数学常数、配置参数或某些约定的值。常量的命名约定为全大写字母,以便与变量进行区分。
PHP中的变量
变量基础
PHP中的变量是用于存储和操作数据的标识符。变量可以包含各种数据类型,如字符串、整数、浮点数、布尔值、数组、对象等。以下是关于PHP变量的一些重要概念和用法:
-
变量命名:
- 变量名以美元符号($)开头,后面跟随一个合法的标识符(字母、数字和下划线,但不能以数字开头)。
- 变量名区分大小写,$name 和 $NAME 是不同的变量。
-
变量赋值:
- 使用赋值操作符(=)将值赋给变量。例如:$name = “John”; 将字符串"John"赋值给变量$name。
- 在赋值之前无需显式声明变量,PHP会根据赋值操作隐式地创建变量。
-
变量数据类型:
- PHP是一种动态类型语言,变量的数据类型会根据赋值语句自动推断。
- 可以使用
var_dump()
函数来检查变量的数据类型和值。
-
变量作用域:
- 变量的作用域指的是变量的可访问范围。
- 全局变量:在函数外部定义的变量,在整个脚本中可访问。
- 局部变量:在函数内部定义的变量,只能在函数内部访问。
- 静态变量:在函数内部定义的静态变量会在函数执行完成后仍然保持其值。
- 超级全局变量:PHP提供了一些特殊变量,称为超级全局变量,如 $_GET、$_POST、$_SESSION等,它们在整个脚本中都可访问。
-
变量的引用:
- 默认情况下,PHP中的变量赋值是按值传递的,即复制变量的值到新变量中。
- 通过使用&操作符,可以创建变量的引用,使两个变量引用同一个值,对一个变量的修改会影响另一个变量。
-
变量的销毁:
- 可以使用
unset()
函数来销毁一个变量,释放其内存空间。 - 销毁后的变量无法再次访问或使用,尝试访问会引发一个错误。
- 可以使用
全局变量
全局变量是在程序的任何地方都能够访问的变量,无论是在函数内部还是在函数外部。在PHP中,全局变量可以在整个脚本中被使用。
下面是关于PHP全局变量的几个重要点:
-
声明全局变量:
- 在函数外部使用
$GLOBALS
超级全局数组声明全局变量。例如,$GLOBALS['name'] = "John";
。 - 在函数内部和函数外部都可以访问
$GLOBALS
数组中的全局变量。
- 在函数外部使用
-
访问全局变量:
- 在函数内部访问全局变量时,需要使用
global
关键字进行引用。 - 通过
global
关键字,可以将函数内部的变量与全局变量进行关联。 - 示例:
$name = "John"; // 全局变量 function printName() { global $name; // 引用全局变量 echo $name; } printName(); // 输出:"John"
- 在函数内部访问全局变量时,需要使用
超全局变量
超级全局变量是在PHP中预定义的一些特殊变量,它们在脚本的任何地方都是可访问的,无需特殊声明或引用。以下是一些常见的超级全局变量:
$_SERVER
:包含有关服务器和执行环境的信息,
$_SERVER['PHP_SELF']
:当前执行脚本的文件名。$scriptName = $_SERVER['PHP_SELF']; echo "当前执行脚本的文件名:$scriptName";
$_SERVER['SERVER_NAME']
:当前运行脚本的服务器主机名。
$_SERVER['HTTP_HOST']
:当前请求的主机头(Host)值。
$_SERVER['HTTP_REFERER']
:引导用户代理到当前页面的引用来源的完整 URL。
$_SERVER['HTTP_USER_AGENT']
:当前用户代理的用户代理字符串(浏览器信息)。
$_SERVER['REQUEST_METHOD']
:当前请求的 HTTP 方法(GET、POST、PUT等)。
$_SERVER['QUERY_STRING']
:当前请求的查询字符串部分(URL中的参数)。
$_SERVER['REMOTE_ADDR']
:正在访问当前页面的用户的 IP 地址。
$_SERVER['REQUEST_URI']
:当前页面的相对路径(不包括域名)。这些只是
$_SERVER
超级全局变量中的一些常用参数,还有其他可用的参数。
$_GET
:用于获取通过URL查询字符串传递的参数,以关联数组的形式存储。
$_GET
是 PHP 中一个有用的超级全局变量,用于获取通过 URL 查询字符串传递的参数。当使用 GET 方法提交表单或通过 URL 中的查询字符串传递参数时,可以使用$_GET
获取这些参数。下面是使用$_GET
的示例:假设有以下 URL:
http://example.com/?name=John&age=25
$name = $_GET['name']; $age = $_GET['age']; echo "姓名:$name"; echo "年龄:$age";
可以传递多个参数(键值对)作为查询字符串,并使用
$_GET
将其解析为关联数组:// 获取所有参数 $p = $_GET; // 打印查询参数 print_r($p);
上述代码将输出类似以下的结果(用于上述 URL):
Array ( [name] => John [age] => 25 )
需要注意的是,
$_GET
返回的是字符串类型的参数值。如果需要将参数值转换为其他类型(如整数),可以使用适当的转换函数,例如intval()
、floatval()
等。在使用
$_GET
获取参数时,应该注意安全问题。始终对获取的值进行验证和过滤,以防止潜在的安全漏洞,例如使用过滤函数(如htmlspecialchars()
)来避免跨站脚本攻击(XSS)等问题。
$_POST
:用于获取通过 POST 方法提交的参数,以关联数组的形式存储。
$_POST
是 PHP 中一个有用的超级全局变量,用于获取通过 POST 方法提交的参数。当使用表单提交或通过 POST 请求向服务器发送数据时,可以使用$_POST
获取这些参数。下面是使用$_POST
的示例:假设有以下 HTML 表单:
<form method="POST" action="process.php"> <input type="text" name="name"> <input type="text" name="age"> <input type="submit" value="Submit"> </form>
在
process.php
文件中,可以使用$_POST
获取表单中提交的参数:$name = $_POST['name']; $age = $_POST['age']; echo "Name: $name"; // 输出表单中输入的内容 echo "Age: $age"; // 输出表单中输入的内容
与
$_GET
类似,当表单包含多个字段时,$_POST
将解析为关联数组,其中字段的名称作为关联数组中的键。// 获取所有参数 $params = $_POST; // 打印参数 print_r($params);
上述代码将输出类似以下的结果:
Array ( [name] => John [age] => 25 )
需要注意的是,
$_POST
返回的是字符串类型的参数值。如果需要将参数值转换为其他类型(例如整数),可以使用适当的转换函数,例如intval()
、floatval()
等。
$_GET
和$_POST
是 PHP 中两个不同的超级全局变量,用于获取通过不同HTTP方法提交的参数。主要区别如下:
数据传输方式:
$_GET
使用URL查询字符串传递参数,而$_POST
使用HTTP POST 方法传递参数。数据隐藏性:
$_GET
的参数显示在URL中,可以被用户看到和修改。而$_POST
的参数在请求体中传输,对用户不可见。数据长度:由于URL长度限制,
$_GET
对所传递参数的大小有较小的限制。而$_POST
通常没有明确大小限制。安全性:
$_POST
相对于$_GET
更安全,因为在传递参数时不会像$_GET
一样将参数暴露在URL中。常见的使用场景:
$_GET
常用于获取页面链接中的参数,如网页搜索,分页,传递简单数据等。它适合传递少量非敏感数据。
$_POST
常用于提交表单以及传输敏感数据,如登录、注册等。
$_REQUEST
:包含了$_GET
、$_POST
和$_COOKIE
的值,可以获取来自请求的用户输入。
$_REQUEST
是一个包含了$_GET
、$_POST
和$_COOKIE
的值的超级全局变量。它用于获取来自请求的用户输入和cookie的值,无论数据是通过URL查询字符串、HTTP POST方法还是通过Cookie传递。
$_REQUEST
的优点是方便和简洁,它能够在一次请求中获取到多种类型的数据。以下是使用$_REQUEST
的示例:// 对于URL查询字符串 ?name=John&age=25 $name = $_REQUEST['name']; $age = $_REQUEST['age']; echo "Name: $name"; // 输出:John echo "Age: $age"; // 输出:25
// 对于通过POST方法提交的表单 $name = $_REQUEST['name']; $age = $_REQUEST['age']; echo "Name: $name"; // 输出表单中输入的内容 echo "Age: $age"; // 输出表单中输入的内容
// 对于通过Cookie传递的值 $value = $_REQUEST['cookie_name']; echo "Cookie Value: $value"; // 输出Cookie的值
$_SESSION
:用于访问和操作会话中存储的变量。
$_SESSION
是 PHP 中一个有用的超级全局变量,用于访问和操作会话中存储的变量。会话(session)是一种在服务器端存储和跟踪用户信息的机制,可以跨不同页面和请求进行数据共享。要开始一个会话,在每个使用
$_SESSION
的页面或脚本的开头需要调用session_start()
函数。下面是使用
$_SESSION
的示例:在第一个页面(例如,login.php):
// 启动会话 session_start(); // 存储用户信息到会话变量中 $_SESSION['username'] = 'John'; $_SESSION['email'] = 'john@example.com'; echo "Session data is set.";
在另一个页面:
// 启动会话 session_start(); // 打印会话变量中的用户信息 echo "Username: " . $_SESSION['username']; echo "Email: " . $_SESSION['email'];
在会话中,可以存储和访问任意类型的数据,如用户身份验证信息、用户配置等。
要销毁会话及其数据,可以使用
session_unset()
函数清除会话变量,然后使用session_destroy()
函数终止会话。session_start(); // 清除会话变量 session_unset(); // 终止会话 session_destroy();
需要注意的是,要使用
$_SESSION
,需要在每个页面或脚本的开头调用session_start()
函数,以确保会话会话数据可用。
$_COOKIE
:用于访问客户端提交的cookie值,以关联数组的形式存储。
$_COOKIE
是 PHP 中一个有用的超级全局变量,用于访问和操作存储在客户端的 cookie 值。Cookie 是一种在客户端存储数据的机制,可以用于在不同页面和请求之间存储和传递信息。Cookie 在服务器端设置,并在客户端的浏览器中存储为键值对。当客户端向服务器发送请求时,浏览器会自动将相关的 cookie 数据包含在请求的头部中发送给服务器。
可以使用
$_COOKIE
来获取和操作客户端发送的 cookie 值。下面是使用$_COOKIE
的示例:// 获取单个 cookie 值 $cookieValue = $_COOKIE['cookie_name']; echo "Cookie Value: $cookieValue";
// 获取所有 cookie 值 $allCookies = $_COOKIE; print_r($allCookies);
在上述代码中,
cookie_name
是 cookie 的名称,通过$_COOKIE['cookie_name']
可以获取对应的值。要设置一个 cookie,使用
setcookie()
函数。setcookie()
函数需要传递参数来设置 cookie 的名称、值、有效期等。// 设置一个 cookie setcookie('cookie_name', 'cookie_value', time() + 3600, '/');
上述代码将创建一个名为
cookie_name
的 cookie,值为cookie_value
,有效期为 3600 秒(1小时),并在整个域名下都可访问。需要注意的是,要使用
$_COOKIE
,浏览器必须在请求中发送相应的 cookie 数据。如果在设置 cookie 之后直接访问$_COOKIE
,则可能无法获取到新设置的 cookie 值。通常,设置 cookie 后,下一次请求才会将 cookie 数据发送给服务器。cookie 和session 的区别
Cookie和Session是用于在Web应用程序中存储和跟踪用户信息的机制,它们有以下主要区别:
存储位置:
- Cookie存储在客户端(浏览器)中,通过HTTP头部在客户端和服务器之间传输。
- Session存储在服务器端,通常使用文件系统或数据库来保存会话数据,而客户端仅保存一个与会话关联的唯一标识符(Session ID)。
内容:
- Cookie可以存储少量的文本数据,通常用于存储用户首选项、登录状态或其他简单的键值对。
- Session可以存储更大量的数据,可以存储复杂的对象、用户认证信息等。
安全性:
- Cookie是存储在客户端的,因此对于敏感信息,必须考虑加密和安全传输,以防止未经授权的访问或篡改。
- Session数据存储在服务器端,对于客户端而言,它只是一个Session ID,实际的数据和操作都在服务器端进行,因此相对较安全。
生命周期:
- Cookie可以设置过期时间,可以是会话级别的(当浏览器关闭时失效)或固定的过期时间。
- Session可以设定过期时间或者根据用户的活动时间来决定过期时间。当用户长时间不活动时,会话可以自动过期。
可扩展性:
- Cookie可以在客户端被禁用或限制,某些浏览器可能限制每个站点可以存储的Cookie数量和大小。
- Session存储在服务器端,可以存储更多的数据,并且不受客户端限制。
使用场景:
- Cookie适用于需要持久化数据到客户端的场景,例如记住用户登录状态、跟踪用户首选项等。
- Session适用于存储和跟踪动态数据,例如购物车信息、用户认证和权限信息等。
$_FILES
:用于访问通过 HTTP POST 方式上传的文件,以关联数组的形式存储。
$_FILES
是一个包含通过 HTTP POST 方法上传的文件的信息的超级全局变量。它是一个关联数组,每个上传的文件信息在数组中对应一个元素。当使用 HTML 表单中的
<input type="file">
元素上传文件时,可以通过$_FILES
获取上传文件的相关信息。下面是使用$_FILES
的示例:在使用文件上传的 HTML 表单中,必须将表单的
enctype
属性设置为multipart/form-data
,用于指明表单需要以多部分(multipart)格式进行编码发送。<form method="POST" action="upload.php" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form>
在
upload.php
文件中,可以使用$_FILES
来获取上传的文件信息:// 获取上传的文件信息 $file = $_FILES['file']; // 打印上传文件相关信息 print_r($file);
通过上述代码,可以获取上传的文件的属性,如文件名、文件类型、上传临时文件的路径等。
$_FILES
是一个关联数组,其中各个键值的含义如下:
'name'
:上传文件的原始文件名。'type'
:上传文件的 MIME 类型。'tmp_name'
:上传文件的临时存储位置。'error'
:上传过程中的错误代码(若无错误则为0)。'size'
:上传文件的大小(字节)。需要注意的几个事项:
$_FILES
只会在使用 POST 方法上传文件时才会包含文件信息。- 上传的文件会被存储在服务器的临时目录中,使用 PHP 的
move_uploaded_file()
函数将文件移动到指定位置。- 在处理上传的文件时,应该对文件的类型、大小、扩展名等进行验证和控制,以确保安全性和数据完整性。
$_ENV
:包含有关环境变量的信息,如操作系统、服务器软件等。
$_ENV
是 PHP 中的一个预定义超级全局变量,用于获取环境变量的值。环境变量是在操作系统环境中设置的一组值,可用于存储系统配置、路径信息、数据库连接参数等。通过$_ENV
可以获取这些环境变量的值。下面是一些使用
$_ENV
的示例:// 获取单个环境变量的值 $home = $_ENV['HOME']; echo "Home directory: $home";
// 获取所有环境变量的值 $envVars = $_ENV; print_r($envVars);
在上述代码中,
HOME
是一个环境变量的名称,通过$_ENV['HOME']
可以获取到它的值。需要注意的是,可用的环境变量和其命名方式可能因操作系统和服务器配置而异。因此,确保检查并使用正确的环境变量名称。
此外,环境变量通常用于敏感信息(如数据库凭据),需要确保在使用时进行正确的保护和处理。避免在公开的代码或输出中直接使用环境变量的值,以免信息泄露或安全漏洞。
$GLOBALS
:是一个全局变量的关联数组,用于在脚本中访问全局变量。
$GLOBALS
是 PHP 中一个预定义的超级全局变量,它是一个包含了全局作用域中的所有变量的全局关联数组。这意味着在任何地方都可以通过$GLOBALS
访问和操作全局范围内的变量,无论这些变量是在全局作用域中定义的还是在函数内部。
$GLOBALS
的键是变量的名称,值是存储在该变量中的数据。可以对$GLOBALS
进行读取、写入和操作,从而实现对全局范围内的变量进行访问和修改。以下是一些使用
$GLOBALS
的示例:// 在全局作用域中定义一个变量 $globalVariable = 42; // 访问全局变量 echo $GLOBALS['globalVariable']; // 输出 42
// 在函数内部访问全局变量 function getGlobalVariable() { return $GLOBALS['globalVariable']; } echo getGlobalVariable(); // 输出 42
// 修改全局变量的值 $GLOBALS['globalVariable'] = 99; echo $globalVariable; // 输出 99
需要注意的是,使用
$GLOBALS
访问全局变量可能会降低代码的可读性和可维护性。全局变量的使用应谨慎,在代码中应尽量避免过度依赖全局变量,因为全局变量的修改会对程序的行为产生深远的影响。
超级全局变量在PHP开发中非常有用,它们提供了方便的访问用户请求、环境变量、会话数据等的方式。但在使用时,要注意对用户输入进行验证和过滤,以确保安全性。同时,为了代码的可读性和可维护性,建议在使用超级全局变量时进行适当的检查和处理,以处理可能的缺失或无效键的情况。
静态变量
静态变量是在函数或类中声明的特殊类型的变量。静态变量与普通变量相比具有以下特点:
- 静态变量只在首次调用声明和初始化时被分配内存,而不是每次函数或方法调用时都被初始化。它们在整个生命周期内保持其值,直到脚本结束或类销毁。
- 静态变量是与类或函数本身关联的,而不是特定的实例或调用。这意味着在一个类的多个实例中,静态变量的值是共享的。
- 静态变量可以在类中的方法中访问,方法可以在任何实例化对象之前调用,或者可以通过类本身访问。
下面是静态变量的示例:
function increment() {
static $count = 0;
$count++;
echo $count;
}
increment(); // 输出 1
increment(); // 输出 2
increment(); // 输出 3
在上述示例中,$count
是一个静态变量。它仅在第一次调用 increment()
函数时被初始化为 0,然后每次调用 increment()
函数时递增并显示当前值。
静态变量在类中也有类似的用法:
class MyClass {
static $count = 0;
public function increment() {
self::$count++;
echo self::$count;
}
}
$obj1 = new MyClass();
$obj1->increment(); // 输出 1
$obj2 = new MyClass();
$obj2->increment(); // 输出 2
$obj1->increment(); // 输出 3
在以上示例中,$count
是一个类的静态变量。它可以通过 self::$count
语法访问和修改。
静态变量在某些情况下非常有用,比如计数器、缓存和记录共享状态等。然而,由于静态变量的特殊性,需要小心使用,以避免潜在的副作用和不可预测的问题。
PHP常量基础
在PHP中,常量是一个固定的值,在脚本运行期间不可改变。常量的命名约定是使用大写字母,以便于在代码中识别和区分。
以下是定义和使用常量的基础知识:
-
定义常量:
- 使用
define()
函数定义常量。通常情况下,常量名称以字母或下划线开头,只能包含字母、数字和下划线,且不能以数字开头。 - 语法:
define("常量名称", "常量值");
- 使用
conts
关键字定义常量 - 语法:
conts
PI = 3.14
- 使用
-
使用常量:
- 声明后的常量可以直接在代码中使用,不需要使用
$
符号。直接使用常量名称即可获取其值。
- 声明后的常量可以直接在代码中使用,不需要使用
-
常量的作用域:
- 常量的作用域是全局的,可以在脚本的任何地方使用。
- 与变量不同,常量在声明后的整个脚本中均可访问,无需担心作用域问题。
-
魔术常量:
-
PHP提供了一些特殊的常量,称为魔术常量(Magic Constants),可以提供关于脚本运行环境的信息.
-
魔术常量是在 PHP 中预定义的一组特殊常量,它们提供了有关代码运行环境和上下文的信息。这些常量不需要事先定义,而是可以直接在脚本中使用。
以下是一些常见的魔术常量:
__LINE__
:表示当前代码所在的行数。__FILE__
:表示当前文件的完整路径和文件名。__DIR__
:表示当前文件所在的目录。`__FUNCTION__
:表示当前函数的名称。__CLASS__
:表示当前类的名称。__TRAIT__
:表示当前 trait 的名称。__METHOD__
:表示当前方法的名称。`__NAMESPACE__
:表示当前命名空间的名称。这些魔术常量以双下划线开头和结尾,通过直接使用它们,可以获取到对应的信息。
例如,
__LINE__
可以用于在脚本中输出当前的行号。魔术常量在开发过程中非常有用,可以帮助调试代码、获取文件名和路径、跟踪函数调用等。但是需要注意的是,魔术常量的值是在编译时确定的,并且对于每个文件和函数而言,其值在运行时是不可变的。而且,它们是区分大小写的。
-
常量在PHP中广泛用于存放固定的配置信息、标识状态或编码中的常用值,以提高代码的可读性和可维护性。建议在需要使用固定值并且不希望在脚本执行期间被修改的情况下使用常量。
总结
变量和常量在编程语言中是不可或缺的元素,它们为我们提供了在程序中保存和操作数据的方式。通过合理利用变量和常量,可以提高代码的可读性、可维护性和灵活性。良好的变量和常量命名习惯以及正确使用它们,将有助于开发高质量的代码,并提高的编程效率。