跳转至主要内容

Frank的技术笔记

PHP类的静态和命名空间的使用

头像 梦叶
最后编辑于 2024年6月1日

最近瞎搞PHP,这不,给我瞎搞出了点东西,反正也没事干,记一下:

PHP类的静态

静态的属性和方法是由static关键字定义的。

<?php

class ClassName {
    public static $attr;

    public static function method() {
        return self::$attr;
    }
}

使用了static关键字的属性和方法,可以不通过new初始化实例就直接使用:

<?php

echo ClassName::method();

要注意的是在以这种方式调用静态内容时,是不可以使用->符号的,只能用::调用。

[warning]

PHP 7.x支持用静态方式调用非静态的内容,这种写法已在PHP 8.x被彻底废弃。

[/warning]

另外静态的内容在类内使用时,用的是self::而不是$this->

PHP命名空间

命名空间是由namespace关键字声明的。

<?php

// PHP namespace 语句必须在所有其他语句的上方,但是可以在注释的下方。
// 例如这个写法就是可以的。

namespace NSName;

声明了命名空间后,后续所有操作都默认调用该命名空间下的内容,包括常量,类,函数等。

<?php

namespace NSName;

$obj = new ClassName(); // 相当于 new \NSName\ClassName();

echo CONSTANT; // 相当于 echo \NSName\CONSTANT;
echo \CONSTANT: // 调用根命名空间下的常量CONSTANT,不受命名空间影响。

需要注意的是,define语句仍然会默认定义在根命名空间下。

<?php

namespace NSName;

define('CONSTANT','value'); // 定义的是\CONSTANT
define('\NSName\CONSTANT','value2'); // 命名空间下的常量必须用绝对方式定义,不受namespace语句影响。

有的时候我们可能会需要从一个没有定义命名空间,或是定义了其他命名空间的文件中调用某个类,但是又不想总是要输入\NSName\ClassName这么一长串,就可以使用use关键字。

<?php

use NSName\ClassName;
// 也可以写成 use \NSName\ClassName;
// 但是官方并不推荐这种写法,所以该省字符就省,不要自作多情

use NSName2\ClassName as ClassName2;
// 创建别名,这样ClassName2就是\NSName2\ClassName了,不会和\NSName\ClassName冲突。

use function NSName\foo;
use constant NSName\CONSTANT;
// use 默认是对类进行操作,函数和常量需要写清楚是 function 还是 constant.

$obj = new ClassName(); // 初始化的其实是\NSName\ClassName这个类
$obj2 = new ClassName2();
// 更多的屎山...

[warning]

要注意的是use没有require或者include的功能,没有被包含的类、函数等是不能拿来use的。

[/warning]

延伸阅读


封面图源:Wikimedia Commons

梦叶
梦叶

原名Frank419,网站站长。不定期更新?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注