0

0

.NET程序员学PHP:static关键字

php中文网

php中文网

发布时间:2016-06-06 19:40:30

|

982人浏览过

|

来源于php中文网

原创

学习PHP也有一段时间了,有些东西觉得还是需要总结一些,对于.NET 程序员 来说,PHP中有很多概念都跟以前的理解不一样,这里我们将重点分析下 static 关键字 。 static 关键字 在C#编程中非常常见,它用来修饰符声明属于类型本身而不是属于特定对象的静态成

学习php也有一段时间了,有些东西觉得还是需要总结一些,对于.net程序员来说,php中有很多概念都跟以前的理解不一样,这里我们将重点分析下static关键字

static关键字在C#编程中非常常见,它用来修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。声明为static的类、函数和变量将不能引用实例方法或变量,另外在C#中一旦类被添加了static修饰符,则其内部所有变量和方法都必须是静态的。静态变量和方法必须通过类名进行引用而不能通过实例对象引用。

那么static关键字在php中与C#中都有些什么不同呢?

声明范围。

相对C#来说,PHP中static变量的使用范围要更广一些,我们不仅可以在类,方法或变量前面添加static修饰符,我们甚至还能给函数内部变量添加static关键字。添加了static修饰符的变量即使在该函数执行完毕值仍然不会丢失,也就是说,在下一次调用这个函数时,变量仍然记得原来的值。如:

php
function test(){
static$var1=1;
$var1+=2;
echo$var1.' ';
}
test();
test();
test();
?>

代码会输出:3 5 7

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

这里有一点需要注意的是,变量的赋值操作只会在变量第一次初始化时会被调用,在之后函数的执行过程中,这个操作不会被调用。

由于PHP中函数同样是一等公民,所以不同于C#,我们可以直接定义函数,并直接在代码的任何地方调用,这一点跟javascript倒是有些相似。因此这时候函数静态变量会比定义全局变量更加有用,它可以避免变量重复定义导致冲突。而由于C#中函数无法直接定义和调用,它必须寄宿在类中,所以如果函数需要静态变量,我们只需要在类中定义便能达到相同效果。

调用方式

C#中,我们调用静态成员的方式非常简单和一致,因为静态成员不属于实例对象,所以无论是方法还是变量,C#对其静态成员的访问方式一律是通过类名.方法(变量)进行。并且在C#中,静态函数是不能被设置为虚方法或者覆盖的。而PHP对此则提供了更为灵活多样的支持。

首先,我们知道PHP中调用实例方法都是通过如:someobj->someFun()调用,那么我们调用静态函数是否也能像C#那样通过SomeClass->someFun()调用呢?答案是否定的,在PHP中,对静态成员的调用只能通过::的方式进行,如:SomeClass::someFun()。

.NET程序员学PHP:static关键字.NET程序员学PHP:static关键字代码

php
class TestC{
publicstatic$var1=1;
public$var2=1;
function t1(){
self
::$var1+=2;
echo self::$var1.' ';
echo$this->var2.' ';
}
publicstaticfunction t2(){
self
::$var1+=2;
echo self::$var1.' ';
}
}
$t=new TestC();
$t->t1();
TestC
::t2();

结果输出为:3 1 5

PHP企业黄页B2B程序[BBWPS]2.1 Build 070918
PHP企业黄页B2B程序[BBWPS]2.1 Build 070918

[PHP企业黄页B2B程序|BBWPS]功能介绍1、公司库、产品库支持无级分类,并提供强大且操作方便的分类管理功能;2、公司库、产品库分类支持显示排序设置;3、提供2级城市类别设置及管理;4、支持关键字定义/过滤;5、管理员及注册会员均可发布企业名录信息,包含:企业名称、通讯地址、联系人、电话、企业图片、企业介绍等信息;6、管理员可后台设置推荐操作;7、管理员后台可管理所有留言/评论,注册会员可管

下载

另外一点和C#中不同的是,在类中的方法中,如果我们需要调用静态变量,必须通过self::$somVar静态变量(注意变量前面的$符号,实例变量不需要),而调用静态方法则为self::someFun()(这里不需要$符号)。如上例。

另外,与C#最大的不同之处就是,PHP中,子类是可以覆盖父类的静态函数或变量的,不仅如此,(站在C#程序员的角度来看,我觉得PHP这点反而将事情搞复杂了),由于默认self::staticFun()调用的是子类的静态函数,这个时候如果我们想调用父类的静态变量怎么办呢?这里PHP提供了额外的parent来调用基类的静态成员。如:

.NET程序员学PHP:static关键字.NET程序员学PHP:static关键字代码

php
class Test1{
publicstatic$var1=1;
publicstaticfunction t2(){
self
::$var1+=2;
echo self::$var1.' ';
}
}
class Test2 extends Test1{
static$var1=‘Hello’;
staticfunction t2(){
parent
::t2();
echo self::$var1.' ';
}
}
Test1
::t2();
Test2
::t2();
?>

结果输出为:3 5 Hello

最好,根据上面的例子我们很容易想到,子类访问父类可以使用parent关键字,那么父类如何访问子类的静态方法呢?这里给出static的另外一个用法,这里如果将调用的静态方法前面的作用域换成static的话,PHP会根据该类的继承层次来计算最终的静态方法。如:

.NET程序员学PHP:static关键字.NET程序员学PHP:static关键字代码

php
class Test1{
function t1(){
static::t2();
}
publicstaticfunction t2(){
echo self::'Test1 ';
}
}
class Test2 extends Test1{
staticfunction t2(){
echo self::'Test2 ';
}
}
$t=new Test2();
$t->t1();
Test2
::t2();
?>

结果输出为:Test2 Test2。

这里t实例在t1方法调用t2静态方法时,会根据其实例找到最终的静态方法并输出Test2。

生命周期

由于.NET和PHP本质的不同,所以static在两种语言中运行时会有明显的不同,在.NET中,static是伴随程序生命周期而存在的,也就是说任何.NET程序,不管是ASP.NET Web程序还是普通的WinForm程序,只要程序启动之后,static的值就会被一直保留,比如我们访问一个Web站点时,如果里面有个int的访问计数的静态变量表示访问人数,只要IIS和该进程没有停止,静态变量值就不会被重置。但在PHP中,static值仅在用户的一次访问过程中存在,也就是说,static的生命周期为从用户发送请求到服务器端返回最终视图结果的整个过程,在这之后,所有的静态变量都会被服务器释放掉,直到下次用户发送新的请求重新初始化。

总结

从上面的分析,我们不难看出,对于静态成员的使用,PHP提供了比C#更为强大的功能或灵活性,但从我的角度来看,这种灵活性不见得就更好,从某种角度来看,如果类的继承层次过于复杂,它可能会让我产生混淆。当然,同样的工具不同人使用效果会完全不一样,既然PHP提供了更多样的选择,那么相信如果使用恰当的话,PHP中的static可能会提供比C#中更为强大而简便的使用方式。

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

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

下载

相关标签:

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

相关专题

更多
PHP 表单处理与文件上传安全实战
PHP 表单处理与文件上传安全实战

本专题聚焦 PHP 在表单处理与文件上传场景中的实战与安全问题,系统讲解表单数据获取与校验、XSS 与 CSRF 防护、文件类型与大小限制、上传目录安全配置、恶意文件识别以及常见安全漏洞的防范策略。通过贴近真实业务的案例,帮助学习者掌握 安全、规范地处理用户输入与文件上传的完整开发流程。

1

2026.01.13

PPT交互图表教程大全
PPT交互图表教程大全

本专题整合了PPT交互图表相关教程汇总,阅读专题下面的文章了解更多详细内容。

41

2026.01.12

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

19

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

134

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

66

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

105

2026.01.09

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.6万人学习

python编程入门系列图文教程
python编程入门系列图文教程

共65课时 | 24.5万人学习

vscode其实很简单
vscode其实很简单

共72课时 | 28.9万人学习

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

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