开启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与SQL注入攻击[一]
Apr 17 PHP
PHP之变量、常量学习笔记
Mar 27 PHP
php合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
PHPMailer安装方法及简单实例
Nov 25 PHP
php的urlencode()URL编码函数浅析
Aug 09 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
May 07 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
Nov 18 PHP
php实现在站点里面添加邮件发送的功能
Apr 28 PHP
php将print_r处理后的数据还原为原始数组的解决方法
Nov 02 PHP
PHP实现字符串大小写转函数的功能实例
Feb 06 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
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
基于Jquery实现键盘按键监听
2014/05/11 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
vue-test-utils初使用详解
2019/05/23 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
python3字符串输出常见面试题总结
2020/12/01 Python
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
师范生自我鉴定范文
2013/10/05 职场文书
幼儿园园长自我鉴定
2013/10/22 职场文书
小学体育教学反思
2014/01/31 职场文书
社会实践活动总结范文
2014/07/03 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
JavaScript数组 几个常用方法总结
2021/11/11 Javascript