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_ordervariables_order来调整。

7. $_SERVER

$_SERVER 是一个数组,包含了服务器的信息和执行环境信息。这包括了如脚本路径、头信息、路径信息等。这些数据由Web服务器生成,每次请求时都会自动填充这个数组。例如,$_SERVER['HTTP_HOST']显示客户端请求的主机名。

8. $GLOBALS

$GLOBALS 是一个包含了所有全局变量的数组,这些变量在脚本的任何地方都可访问。$GLOBALS数组中的每个键名都是一个全局变量的名称,键值是该变量的值。这不仅限于用户定义的变量,也包括PHP的超全局变量,如$_SERVER$_POST等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值