PHP使用静态方法的几个注意事项

 本文实例介绍了PHP使用静态方法的几个常见注意事项。分享给大家供大家参考。具体方法如下:

1. 即使类中的方法并未用static声明,但其未使用到可改变的类成员变量,在外部仍可用操作符::来调用;

2. 以静态方式(用::操作符)调用的方法中$this的取值是由调用时的上下文决定的!而不是定义他的类!!

例如以下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

<?php 
class TestClass1 

  public $normal_v = 'normal_v from TestClass1'; 
  public static $STATIC_V = 'STATIC_V from TestClass1'; 
  public function test_func1() 
  { 
    echo $this->normal_v.'<br />'.self::$STATIC_V; 
  } 

class TestClass2 

  public $normal_v = 'normal_v from TestClass2'; 
  public static $STATIC_V = 'STATIC_V from TestClass2'; 
  public function test_func2() 
  { 
    TestClass1::test_func1(); 
  } 

$t2 = new TestClass2(); 
$t2->test_func2();

这段代码是输出会是什么呢,我原以为会是normal_v from TestClass1 <br /> STATIC_V from TestClass1,测试发现其实我错了,正确的输出是:

normal_v from TestClass2
STATIC_V from TestClass1

说明:test_func1()虽然是在TestClass1中定义的,但却是在TestClass2中调用的,其内部的$this变量则是由TestClass2决定的!

其实这两个类的关系应该属于"双向关联".

感兴趣的朋友可以测试运行本文实例,相信会有新的收获!

时间: 2024-08-31 08:14:42

PHP使用静态方法的几个注意事项的相关文章

PHP使用静态方法的几个注意事项_php技巧

本文实例介绍了PHP使用静态方法的几个常见注意事项.分享给大家供大家参考.具体方法如下: 1. 即使类中的方法并未用static声明,但其未使用到可改变的类成员变量,在外部仍可用操作符::来调用: 2. 以静态方式(用::操作符)调用的方法中$this的取值是由调用时的上下文决定的!而不是定义他的类!! 例如以下的代码: <?php class TestClass1 { public $normal_v = 'normal_v from TestClass1'; public static $S

创建成员内部类的注意事项

注意事项一:在内部类中可以随意使用外部类的成员方法以及成员变量. 众所周知,在定义成员方法或者成员变量的时候,可以给其加上一些权限的修饰词,以防止其他类的访问.如在成员变量或者成员方法前面,加上Private关键字,则其他类就无法调用这个类中的成员方法或则和成员变量.但是,如果这个类有成员内部类,则不受这方面的限制.也就是说,在成员内部类中可以随意引用外部类的成员方法以及成员变量,即使这些类成员方法或者成员变量被修饰了private.如在成员外部类中定义了一个i变量,并且利用private关键字

java静态方法-java的静态方法访问静态成员问题

问题描述 java的静态方法访问静态成员问题 java中静态方法只能访问静态成员为什么main方法前面有static没什么还可以访问飞静态成员呢 解决方案 静态方法不可以访问非静态成员变量的.因为静态方法在类没有创建对象前就已经存在了,而类中的成员变量是要创建对象后才有的, 所以不能使用非静态成员变量.你可以去试试就知道了.定义在main方法里面的变量是叫局部变量,不是成员变量. 解决方案二: 不可以访问,除非实例化. class Program { int i; static void Mai

深入分析PHP优化及注意事项_php技巧

1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的效率主要区别在内存:静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存. 任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同.静态内存是连续的,

微信小程序之ES6与事项助手的功能实现_javascript技巧

由于官方IDE更新到了0.11.112301版本,移除了对Promise的支持,造成事项助手不能正常运行,解决此问题,在项目中引入第三方兼容库Bluebird支持Promise,代码已经整合到项目代码中. 好久没有写关于微信小程序的随笔了,其实是不知道写点什么好,之前的豆瓣图书和知乎日报已经把小程序的基础部分写的很详细了,高级部分的API有些还得不到IDE的调试支持.之前发表了知乎日报小例,有网友问我小程序有没有关于日历显示的组件,可以显示所有天数的,自己看了一遍,好像没有这个组件,所以打算那这

扩展方法用法及其原理和注意事项

前言 一直以来尤其像C#一些常见的语法,本人更愿意去探讨其内部实现的原理,为什么要这么做呢?只是为了当我真正在开发中运用语法的时候不会因为犯常识性错误或者说因为一些注意事项未曾注意到而耽误一些无谓的时间,同时也能理解的更深入而不是仅仅停留在表面(或许理解也不是太透).(当然本人能力有限,太高深的东西必定是研究不明白了,也只有这能力了). 概念 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类

安装win7系统后需要注意的三大事项

  安装win7系统后需要注意的三大事项 1.禁止休眠 休眠过程中会导致网络也会跟着断开,而且还会占用系统盘的空间,关闭的话还可以提高运行速度的,何乐而不为呢? 2.删除旧系统备份文件 在win7系统安装完毕之后,默认情况下是会自动生成系统备份的,但是因为系统备份所占据的内存空间比较大,所以建议大家删除.在后期如果遇到问题,可以选择启动系统还原功能即可修复了. 3.虚拟内存的设置 在安装完成之后为了能够有效的提升运行速度,建议用户可以转移内置的虚拟内存,如果win7系统用户自带的内存空间较大的话

并行安装Visual Studio系统的注意事项分析

有时候出于系统兼容性的需要,开发人员可能会在操作系统上安装Visual的各个版本.如 Visual2008与2005.为什么开发人员会有这么需要呢?如原先开发人员在2005环境下开发了一个 ERP系统.现在开发人员觉得2008这个开发平台比较适合自己,就需要将这个软件移植到2008的 开发环境下.由于不同的版本在功能上会有所差异,为此就需要同时使用两个不同版本的开发 环境,以便于测试系统的兼容性.此时就需要在同一台计算机上同时部署多个版本的开发环境 .利用专业的术语就是说,Visual的并行安装

MySQL主从严重延迟后迁移Transfer的注意事项

MySQL-Transfer逐渐有一些其他公司的同学在使用,这里会持续更新运维上的注意事项.        背景        正常情况下,若要从原来的主从切换成Transfer 模式,只需要作如下步骤: 1.在slave相同机器上部署一个Transfer,并配置好各种remote_slave参数 2.在slave上stop slave 3.把slave的表结构dump给transfer 4.从slave中查看当前执行到master的位置 5.在transfer执行change master x