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