跳转至主要内容
晴雨技术笔记

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

杏川铭心 杏川铭心
发表于 2024年6月1日
  • 本文最后编辑于 549 天前,部分信息可能已严重过时,请注意甄别。
  • 最近瞎搞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

    • 特别提醒:

      评论看到就会回,但是不保证速度,有的时候站长忘记看的话就会出现审核好几天也没有动静的情况……

      有垃圾评论检查,如果评论之后直接消失、没反应说明被识别为垃圾评论了。

      如果等不及的话,可以加群!

    杏川铭心
    杏川铭心

    群号:1101838302,欢迎友好交流 :P 曾用名Frank419(现在也是我在很多地方的用户名),网站站长。

    标签:

    发表回复

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