0

0

php的static静态方法是什么

藏色散人

藏色散人

发布时间:2022-10-31 09:40:18

|

2145人浏览过

|

来源于php中文网

原创

php static静态方法中的“静态”指的是无需对类进行实例化,就可以直接调用这些属性和方法;而static就是一个关键字,用来修饰类的属性及方法,其使用语法如“class Foo {public static $my_static = 'hello';}”。

php的static静态方法是什么

本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。

PHP static静态详解

PHP 类属性和方法都需要在类实例化后才能调用(常量属性除外),但是,PHP 还提供了静态属性和静态方法,所谓「静态」指的是无需对类进行实例化,就可以直接调用这些属性和方法。静态类不是不可以实例化,而是不需要实例化就可以用。

静态成员的定义

用static关键字来修饰类的属性、方法,称这些属性、方法为静态属性、静态方法。

立即学习PHP免费学习笔记(深入)”;

1、静态属性

语法:

static 属性名

实例:

2、静态方法

语法:

static function 方法名{
    //代码
}

实例:

注:静态属性和方法与对象属性和方法一样,支持设置 privateprotectedpublic 三种可见性级别。

静态成员的调用

1、在类外调用静态属性/方法

通过 类名::属性/方法 的方式调用。

注:预定义常量 PHP_EOL 表示系统换行符。

结果:

$staticvalue: zhangsan
$a: hello

通过 对象名::属性/方法 的方式调用。

结果:

$staticvalue: zhangsan
$a: hello

通过对象名 -> 方法调用、对象名 -> 属性会失败。

 staticvalue.PHP_EOL;
echo '$a: '.$obj -> staticMethod();
?>

结果:

$staticvalue:
$a: hello

2、在非静态方法中调用静态属性/方法

通过 self::属性/方法 的方式调用,self 指向当前类,就像 $this 指向当前对象一样;而在没有实例化的情况下,$this 指针指向的是空对象,所以不能动过它引用静态属性和方法。

 noStatic();
?>

结果:

$staticvalue: zhangsan
$a: hello

3、在静态方法中调用静态属性/方法

与在非静态方法中调用静态属性/方法一样。

 staticMethod2();
?>

结果:

$staticvalue: zhangsan
$a: hello
$staticvalue: zhangsan
$a: hello

4、调用另一个类的静态属性/方法

如果在一个类中调用其他类的静态属性和方法,需要通过 完整类名:: 进行引用。

 staticMethod();
?>

结果:

$staticvalue1: xiaomin
$staticvalue2: zhangsan
$staticvalue1: xiaomin
$staticvalue2: zhangsan

5、调用privateprotected可见性级别的静态属性/方法

由于privateprotected属性的限制只在类内调用,想在类外调用,需为外部提供一个public的方法,方法访问privateprotected属性。术语:类对外提供接口。

 port1();
echo "\r\n";
Mystatic::port2();
?>

结果:

$staticvalue1: zhangsan
$staticvalue2: 20
$staticvalue3: student
$a: hello

$staticvalue1: zhangsan
$staticvalue2: 20
$staticvalue3: student
$a: hello

静态属性支持动态修改

在实际应用中会有一个类的多个对象,可能会共享一份数据。类常量和静态属性都可以实现。静态属性与类常量相似(相同),唯一的区分是类常量不可以更改,静态属性可以更改。访问方法是一样的,都可以使用::访问。 静态属性需要加$,常量名前没有$,所以访问类常量时根本不需要加。

MVM mall 网上购物系统
MVM mall 网上购物系统

采用 php+mysql 数据库方式运行的强大网上商店系统,执行效率高速度快,支持多语言,模板和代码分离,轻松创建属于自己的个性化用户界面 v3.5更新: 1).进一步静态化了活动商品. 2).提供了一些重要UFT-8转换文件 3).修复了除了网银在线支付其它支付显示错误的问题. 4).修改了LOGO广告管理,增加LOGO链接后主页LOGO路径错误的问题 5).修改了公告无法发布的问题,可能是打压

下载

1、类常量

A='aaa';
//$obj1::A='aaa';会报错
echo "\r\n";
$obj2 = new Myconst();
echo 'A: '.$obj2::A.PHP_EOL;
?>

结果:

A: 1234

A: 1234

2、静态属性

结果:

$A: 1234
$A: 6666
$A: 6666
$A: 5555
$A: 5555

静态成员的继承和重写

和非静态属性/方法一样,静态属性和方法也可以被子类继承,静态属性和方法还可以被子类重写。

1、静态属性

子类可以重写父类的静态成员变量, 但父类的静态变量依然存在, 这两个静态成员变量是独立的. 会根据调用的类名分别进行访问。

test().PHP_EOL;     //通过对象调用静态方法test,静态属性$a的值+1
$obj2=new Mystatic;                              //新建另一个父类对象
echo '此时$a的值为: '.$obj2->test().PHP_EOL;     //新父类对象调用静态方法test,静态属性$a的值+1+1
$obj3=new Mystatic2;                             //新建子类对象
echo '此时$a的值为: '.$obj3->test().PHP_EOL;     //子类对象调用同名静态方法test, 静态属性$a的值+1+1+1
echo Mystatic::$a.PHP_EOL;    //通过父类::直接访问静态成员$a变量
echo $obj1::$a.PHP_EOL;   //通过对象名::可以直接访问静态成员$a变量
?>

结果:

此时$a的值为: 1
此时$a的值为: 2
此时$a的值为: 3
3
3

2、静态方法

子类可以重写父类的静态方法。

通过 __CLASS__ 可以获取当前类的类名,我们分别调用两个类的 getClassName 方法:

结果:

Mystatic1
Mystatic2

说明子类重写了父类的同名静态方法,同样我们在子类上也可以调用父类中的 whoclassName 方法:

结果:

Mystatic1
Mystatic1

为什么第二个打印的结果是父类名 Mystatic1 而不是子类名 Mystatic2?这是因为, $this 指针始终指向持有它的引用对象,而self 指向的是定义时持有它的类而不是调用时的类,为了解决这个问题,从 PHP 5.3 开始,新增了一个叫做延迟静态绑定的特性。

延迟静态绑定

延迟静态绑定(Late Static Bindings)针对的是静态方法的调用,使用该特性时不再通过 self:: 引用静态方法,而是通过 static::,如果是在定义它的类中调用,则指向当前类,此时和 self 功能一样,如果是在子类或者其他类中调用,则指向调用该方法所在的类

结果:

Mystatic1
Mystatic2

表明后期静态绑定生效,即 static 指向的是调用它的方法所在的类,而不是定义时,所以称之为延迟静态绑定。

此外,还可以通过 static::class 来指向当前调用类的类名,例如我们可以通过它来替代 __CLASS__,这样上述子类就没有必要重写 getClassName 方法了:

结果:

Mystatic1
Mystatic2
Mystatic1
Mystatic2

同理,self::class 则始终指向的是定义它的类。

静态与非静态的区别

  • 静态属性和方法可以直接通过类引用,所以又被称作类属性和类方法。非静态属性和非静态方法需要实例化后通过对象引用,因此被称作对象属性和对象方法。

  • 静态属性保存在类空间,非静态属性保存在对象空间。非静态方法可以访问类中的任何成员(包括静态),静态方法只能访问类中的静态成员。

  • 静态方法可以直接调用,类名调用和对象调用(类名或self::调用),但是非静态方法只能通过对象调用(对象名或$this->调用)。

  • 一个类的所有实例对象,共用类中的静态属性。如果修改了这个类静态属性,那么这个类的所有对象都能访问到这个新值。

  • 静态方法和属性的生命周期跟相应的类一样长,静态方法和静态属性会随着类的定义而被分配和装载入内存中。一直到线程结束,静态属性和方法才会被销毁。 非静态方法和属性的生命周期和类的实例化对象一样长,只有当类实例化了一个对象,非静态方法和属性才会被创建,而当这个对象被销毁时,非静态方法也马上被销毁。静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。但静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

应用场景:

  1. 静态方法最适合工具类中方法的定义;比如文件操作,日期处理方法等.

  2. 静态变量适合全局变量的定义.

推荐学习:《PHP视频教程

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2596

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1623

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1509

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1417

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1447

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号