开启PHP Static 关键字之旅模式


Posted in PHP onNovember 13, 2015

声明类成员或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。

为了兼容PHP4,如果没有指定“可见性”,属性和方法默认为public。

由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。

静态属性不可以由对象通过->操作符来访问。

用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。

就像其它所有的PHP静态变量一样,静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。 所以你可以把静态属性初始化为整型或数组,但不能指向另一个变量或函数返回值,也不能指向一个对象。

PHP5.3.0之后,我们可以用一个变量来动态调用类。但该变量的值不能为关键字self, parent 或static。

Example #1 静态成员代码示例

<?php
class Foo
{
  public static $my_static = 'foo';
  public function staticValue() {
    return self::$my_static;
  }
}
class Bar extends Foo
{
  public function fooStatic() {
    return parent::$my_static;
  }
}
print Foo::$my_static . " ";
$foo = new Foo();
print $foo->staticValue() . " ";
print $foo->my_static . " ";   // Undefined "Property" my_static 
print $foo::$my_static . " ";
$classname = 'Foo';
print $classname::$my_static . " "; // PHP 5.3.0之后可以动态调用
print Bar::$my_static . " ";
$bar = new Bar();
print $bar->fooStatic() . " ";
?>

Example #2 静态方法代码示例

<?php
class Foo {
  public static function aStaticMethod() {
    // ...
  }
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0
?>

关于static 中静态变量和静态方法的总结

静态变量

静态变量是只存在于函数作用域的变量,不过,在函数执行完成后,这种变量的值不会丢失,也就是说,在下一次调用这个函数时,变量仍然会记得原来的值。要将某个变量定义为静态的,只需要在变量前加上 static 关键字即可。

在类中,static关键字有两种主要用法,一是用来定义静态成员,一是用来定义静态方法。在类的内部,可以使用作用域限定符 (::) 来访问不同层次作用域的变量。

静态方法

静态方法和非静态方法之间有一个重要的区别:在调用静态方法时,不再需要拥有类的实例。

静态方法和非静态方法使用原则:一是如果某个方法中不包含$this变量,就应该时静态方法;如果不需要类的实例,可能还应该使用静态类,这样可以免去实例化类的工作。另,在静态方法中时不能使用$this变量的,因为静态方法不属于某个特定的实例。

PHP 相关文章推荐
PHP.MVC的模板标签系统(四)
Sep 05 PHP
PHP n个不重复的随机数生成代码
Jun 23 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
Sep 23 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
Oct 31 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
Oct 15 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
Thinkphp实现站点静态化的方法详解
Mar 21 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
thinkphp3.2框架中where条件查询用法总结
Aug 13 PHP
如何在PHP中读写文件
Sep 07 PHP
php正则表达式学习笔记
Nov 13 #PHP
php邮箱地址正则表达式验证
Nov 13 #PHP
合格的PHP程序员必备技能
Nov 13 #PHP
PHP基于yii框架实现生成ICO图标
Nov 13 #PHP
php中session定期自动清理的方法
Nov 12 #PHP
详解php设置session(过期、失效、有效期)
Nov 12 #PHP
php表单提交实例讲解
Nov 12 #PHP
You might like
php 强制下载文件实现代码
2013/10/28 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
js中的eventType事件及其浏览器支持性介绍
2013/11/29 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
JavaScript函数详解
2015/02/27 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
js命名空间写法示例
2015/12/18 Javascript
Bootstrap入门书籍之(三)栅格系统
2016/02/17 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
用python + openpyxl处理excel2007文档思路以及心得
2014/07/14 Python
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
python__name__原理及用法详解
2019/11/02 Python
python默认参数调用方法解析
2020/02/09 Python
python实现文法左递归的消除方法
2020/05/22 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
承诺书格式范文
2014/06/03 职场文书