PHP静态绑定和超全局变量(superglobals)
静态绑定
<?php
class A {
const MY_CONST = false;
public function my_const_self() {
var_dump(self::MY_CONST);
return self::MY_CONST;
}
public function my_const_static() {
var_dump(static::MY_CONST);
return static::MY_CONST;
}
}
class B extends A {
const MY_CONST = true;
}
$b = new B();
echo $b->my_const_self ? 'yes'."\n" : 'no'."\n"; // output: no
echo $b->my_const_static ? 'yes'."\n" : 'no'."\n"; // output: no
echo $b->my_const_self() ? 'yes' ."\n": 'no'."\n"; // output: no
echo $b->my_const_static() ? 'yes'."\n" : 'no'."\n"; // output: yes
?>
输出结果:
Warning: Undefined property: B::$my_const_self in /data/172111163289994121.php on line 19
no
Warning: Undefined property: B::$my_const_static in /data/172111163289994121.php on line 20
no
bool(false)
no
bool(true)
yes
这段 PHP 代码定义了两个类:`A` 和 `B`。`B` 继承自 `A`。类 `A` 有一个常量 `MY_CONST`,其值为 `false`,而类 `B` 重写了这个常量,将其值设为 `true`。
类 `A` 中还定义了两个方法:`my_const_self` 和 `my_const_static`。这两个方法分别使用 `self` 和 `static` 关键字来引用常量 `MY_CONST`。
1. **`my_const_self` 方法**:这个方法返回 `self::MY_CONST`。在 PHP 中,`self` 关键字始终引用定义该方法的类,而不是调用该方法的类的上下文。因此,无论你是在类 `A` 的实例上调用这个方法,还是在继承自 `A` 的类(如 `B`)的实例上调用,`self::MY_CONST` 始终引用类 `A` 中的 `MY_CONST` 常量。
2. **`my_const_static` 方法**:这个方法返回 `static::MY_CONST`。`static` 关键字在 PHP 中用于后期静态绑定,它引用的是调用该方法的类的上下文,而不是定义该方法的类。因此,如果你在类 `A` 的实例上调用这个方法,它会返回类 `A` 中的 `MY_CONST` 常量。但如果你在继承自 `A` 的类(如 `B`)的实例上调用这个方法,它会返回该类(`B`)中的 `MY_CONST` 常量。
接下来,代码创建了一个类 `B` 的实例 `$b`,并调用了这两个方法。
* `$b->my_const_self` 返回的是类 `A` 中的 `MY_CONST` 常量值,即 `false`。因此,`echo $b->my_const_self ? 'yes' : 'no';` 输出 `no`。
* `$b->my_const_static` 返回的是类 `B` 中的 `MY_CONST` 常量值,即 `true`。因此,`echo $b->my_const_static ? 'yes' : 'no';` 输出 `yes`。
简而言之,`self` 关键字始终引用定义该方法的类中的常量,而 `static` 关键字则根据调用方法的实例的类来引用常量。在这个例子中,由于 `B` 继承了 `A` 并重写了 `MY_CONST` 常量,所以 `static::MY_CONST` 在 `B` 的实例上调用时会返回 `B` 中的常量值。
self::CONST和$this::CONST区别
<?php
class a {
const CONST_INT = 10;
public function getSelf(){
return self::CONST_INT;
}
public function getThis(){
return $this::CONST_INT;
}
}
class b extends a {
const CONST_INT = 20;
public function getSelf(){
return parent::getSelf();
}
public function getThis(){
return parent::getThis();
}
}
$b = new b();
print_r($b->getSelf()); //10
print_r($b->getThis()); //20
?>
超全局变量(superglobals)
在PHP中,superglobals是PHP系统预定义的变量,它们在所有作用域中始终可用。
1. $_COOKIE
$_COOKIE
是一个数组,包含了通过HTTP Cookies传递给当前脚本的变量。当用户访问一个页面时,服务器可以设置Cookies,并通过HTTP响应头发送给用户的浏览器。用户浏览器再次访问此服务器时,会将Cookies通过HTTP请求头发送回服务器。PHP会自动将这些Cookies信息存入$_COOKIE
数组。
2. $_ENV
$_ENV
包含了通过环境方式传递给PHP的变量。这些变量由服务器的环境提供,可以通过修改服务器配置(如Apache的环境变量设置或.htaccess
文件)或脚本运行环境(如Shell环境变量)来设置。PHP脚本启动时,这些变量就会被赋值到$_ENV
中。
3. $_FILES
$_FILES
是一个数组,包含了用户通过HTTP POST方法上传的文件信息。当表单设置enctype="multipart/form-data"
并包含文件上传字段时,文件上传至服务器后,PHP会处理这些文件,并将相关信息(如文件名、文件类型、文件大小、临时存储路径等)存入$_FILES
数组。
4. $_GET
$_GET
是一个数组,包含了通过HTTP GET方法发送的所有参数。这些数据通常附加在URL后,形成查询字符串,如http://example.com/index.php?name=value
。用户访问此URL时,PHP会解析URL中的查询字符串,并将参数及其值存入$_GET
数组。
5. $_POST
$_POST
是一个数组,包含了通过HTTP POST方法发送的数据。这通常用于表单提交。当表单以POST方法提交时,表单数据不会出现在URL中,而是作为请求的body发送,PHP处理这些数据,并将其存入$_POST
数组。
6. $_REQUEST
$_REQUEST
默认情况下包含了$_GET
、$_POST
和$_COOKIE
的内容。它是一个综合数组,包含了通过GET方法、POST方法和Cookies传递给脚本的数据。$_REQUEST
的内容来源于这三个数组,但具体包含哪些数组的数据,可以通过配置php.ini中的request_order
和variables_order
来调整。
7. $_SERVER
$_SERVER
是一个数组,包含了服务器的信息和执行环境信息。这包括了如脚本路径、头信息、路径信息等。这些数据由Web服务器生成,每次请求时都会自动填充这个数组。例如,$_SERVER['HTTP_HOST']
显示客户端请求的主机名。
8. $GLOBALS
$GLOBALS
是一个包含了所有全局变量的数组,这些变量在脚本的任何地方都可访问。$GLOBALS
数组中的每个键名都是一个全局变量的名称,键值是该变量的值。这不仅限于用户定义的变量,也包括PHP的超全局变量,如$_SERVER
、$_POST
等。