开启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的日期与时间函数技巧
Apr 24 PHP
超小PHP小马小结(方便查找后门的朋友)
May 05 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
使用PHP备份MYSQL数据的多种方法
Jan 15 PHP
php解析url的三个示例
Jan 20 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
Jul 28 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
服务器上配置PHP运行环境教程
Feb 12 PHP
php模板引擎技术简单实现
Mar 15 PHP
php生成静态页面并实现预览功能
Jun 27 PHP
PHP生成图表pChart的示例解析
Jul 31 PHP
php字符串倒叙
Apr 01 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 循环列出目录内容的函数代码
2010/05/26 PHP
PHP 年龄计算函数(精确到天)
2012/06/07 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
Prototype使用指南之range.js
2007/01/10 Javascript
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python 判断一个进程是否存在
2009/04/09 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
Django--权限Permissions的例子
2019/08/28 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
IBatis持久层技术
2016/07/18 面试题
委托培训协议书
2014/11/17 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python
canvas实现贪食蛇的实践
2022/02/15 Javascript