static关键字用来修饰属性、方法,称这些属性、方法为静态属性、静态方法。

static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”

如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“::”调用。

static关键字可以用来修饰变量、方法。

不经过实例化,就可以直接访问类中static的属性和static的方法。

static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法。因为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调用。

static的属性,在内存中只有一份,为所有的实例共用。

使用self:: 关键字访问当前类的静态成员。

一个类的所有实例,共用类中的静态属性。

也就是说,在内存中即使有多个实例,静态的属性也只有一份。

下面例子中的设置了一个计数器$count属性,设置private 和 static 修饰。

这样,外界并不能直接访问$count属性。而程序运行的结果我们也看到多个实例在使用同一个静态的$count 属性。

view plaincopy to clipboardprint?

<?php     class user  {        private static $count = 0 ; //记录所有用户的登录情况.        public function __construct() {            self::$count = self::$count + 1;        }        public function getCount() {              return self::$count;        }        public function __destruct() {            self::$count = self::$count – 1;        }    }    $user1 = new user();    $user2 = new user();    $user3 = new user();    echo “now here have ” . $user1->getCount() . ” user”;
echo ”

“;

unset($user3);

echo “now here have ” . $user1->getCount() . ” user”;

?>

<?php class user { private static $count = 0 ; //记录所有用户的登录情况. public function __construct() {    self::$count = self::$count + 1; } public function getCount() {      return self::$count; } public function __destruct() {    self::$count = self::$count – 1; } } $user1 = new user(); $user2 = new user(); $user3 = new user(); echo “now here have ” . $user1->getCount() . ” user”;
echo ”

“;

unset($user3);

echo “now here have ” . $user1->getCount() . ” user”;

?>

静态属性直接调用

静态属性不需要实例化就可以直接使用,在类还没有创建时就可以直接使用。

使用的方式是: 类名::静态属性名

view plaincopy to clipboardprint?

<?php
class Math

{

public static $pi = 3.14;

}

// 求一个半径3的园的面积。

$r = 3;

echo “半径是 $r 的面积是

“;

echo Math::$pi * $r * $r;

echo ”

“;

//这里我觉得 3.14 不够精确,我把它设置的更精确。

Math::$pi = 3.141592653589793;

echo “半径是 $r 的面积是

“;

echo Math::$pi * $r * $r;

?>

<?php
class Math

{

public static $pi = 3.14;

}

// 求一个半径3的园的面积。

$r = 3;

echo “半径是 $r 的面积是

“;

echo Math::$pi * $r * $r;

echo ”

“;

//这里我觉得 3.14 不够精确,我把它设置的更精确。

Math::$pi = 3.141592653589793;

echo “半径是 $r 的面积是

“;

echo Math::$pi * $r * $r;

?>

类没有创建,静态属性就可以直接使用。那静态属性在什么时候在内存中被创建? 在PHP中没有看到相关的资料。引用Java中的概念,来解释应该也具有通用性。静态属性和方法,在类被调用时创建。

静态方法

静态方法不需要所在类被实例化就可以直接使用。

使用的方式是类名::静态方法名

下面我们继续写这个Math类,用来进行数学计算。我们设计一个方法用来算出其中的最大值。既然是数学运算,我们也没有必要去实例化这个类,如果这个方法可以拿过来就用就方便多了。我们这只是为了演示static方法而设计的这个类。在PHP提供了 max() 函数比较数值。

view plaincopy to clipboardprint?

<?php     class Math  {        public static function Max($num1, $num2) {            return $num1 > $num2 ? $num1 : $num2;
    }

}

$a = 99;

$b = 88;

echo “显示 $a 和 $b 中的最大值是”;

echo ”

“;

echo Math::Max($a, $b);

echo ”

“;

echo ”

“;

echo ”

“;

$a = 99;

$b = 100;

echo “显示 $a 和 $b 中的最大值是”;

echo ”

“;

echo Math::Max($a,$b);

?>

<?php class Math { public static function Max($num1, $num2) {    return $num1 > $num2 ? $num1 : $num2;
}

}

$a = 99;

$b = 88;

echo “显示 $a 和 $b 中的最大值是”;

echo ”

“;

echo Math::Max($a, $b);

echo ”

“;

echo ”

“;

echo ”

“;

$a = 99;

$b = 100;

echo “显示 $a 和 $b 中的最大值是”;

echo ”

“;

echo Math::Max($a,$b);

?>

静态方法如何调用静态方法

第一个例子,一个静态方法调用其它静态方法时,使用self::

view plaincopy to clipboardprint?

<?php     // 实现最大值比较的Math类。    class Math  {        public static function Max($num1, $num2) {            return $num1 > $num2 ? $num1 : $num2;
    }

public static function Max3($num1, $num2, $num3) {

$num1 = self::Max($num1, $num2);

$num2 = self::Max($num2, $num3);

$num1 = self::Max($num1, $num2);

return $num1;

}

}

$a = 99;

$b = 77;

$c = 88;

echo “显示 $a $b $c 中的最大值是”;

echo ”

“;

echo Math::Max3($a, $b, $c);

?>

<?php // 实现最大值比较的Math类。 class Math { public static function Max($num1, $num2) {    return $num1 > $num2 ? $num1 : $num2;
}

public static function Max3($num1, $num2, $num3) {

$num1 = self::Max($num1, $num2);

$num2 = self::Max($num2, $num3);

$num1 = self::Max($num1, $num2);

return $num1;

}

}

$a = 99;

$b = 77;

$c = 88;

echo “显示 $a $b $c 中的最大值是”;

echo ”

“;

echo Math::Max3($a, $b, $c);

?>

静态方法调用静态属性

使用self:: 调用本类的静态属性。

view plaincopy to clipboardprint?

静态方法不能调用非静态属性 。不能使用self::调用非静态属性。

view plaincopy to clipboardprint?

也不能使用 $this 获取非静态属性的值。

静态方法调用非静态方法

PHP5中,在静态方法中不能使用 $this 标识调用非静态方法。

view plaincopy to clipboardprint?

<?php
// 实现最大值比较的Math类。

class Math

{

public function Max($num1, $num2) {

echo “bad

“;

return $num1 > $num2 ? $num1 : $num2;

}

public static function Max3($num1, $num2, $num3) {

$num1 = $this->Max($num1, $num2);

$num2 = $this->Max($num2, $num3);

$num1 = $this->Max($num1, $num2);

return $num1;

}

}

$a = 99;

$b = 77;

$c = 188;

echo “显示 $a $b $c 中的最大值是”;

echo ”

“;

echo Math::Max3($a, $b, $c);    //同样的这个会报错

?>

<?php
// 实现最大值比较的Math类。

class Math

{

public function Max($num1, $num2) {

echo “bad

“;

return $num1 > $num2 ? $num1 : $num2;

}

public static function Max3($num1, $num2, $num3) {

$num1 = $this->Max($num1, $num2);

$num2 = $this->Max($num2, $num3);

$num1 = $this->Max($num1, $num2);

return $num1;

}

}

$a = 99;

$b = 77;

$c = 188;

echo “显示 $a $b $c 中的最大值是”;

echo ”

“;

echo Math::Max3($a, $b, $c); //同样的这个会报错

?>

当一个类中有非静态方法被self:: 调用时,系统会自动将这个方法转换为静态方法。

view plaincopy to clipboardprint?

<?php     // 实现最大值比较的Math类。    class Math  {            public function Max($num1, $num2) {                   return $num1 > $num2 ? $num1 : $num2;
    }

public static function Max3($num1, $num2, $num3) {

$num1 = self::Max($num1, $num2);

$num2 = self::Max($num2, $num3);

$num1 = self::Max($num1, $num2);

return $num1;

}

}

$a = 99;

$b = 77;

$c = 188;

echo “显示 $a $b $c 中的最大值是”;

echo ”

“;

echo Math::Max3($a, $b, $c);

?>

static在php中,php中static关键字在类中的使用相关推荐

  1. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解

    我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...

  2. Java中divide用法_java的BIgInteger类中divideAndRemainder方法怎么用?

    展开全部 Java的BigInteger类中e68a8462616964757a686964616f31333433633436divideAndRemainder方法的用法是,先建一个BigInte ...

  3. java中怎样定义实数_Java Math 类中的新功能,第 1 部分: 实数

    在这篇由两部分组成的文章中,Elliotte Rusty Harold 与您一起探讨经典 java.lang.Math 类中的"新"功能.第 1 部分主要讨论比较单调的数学函数.第 ...

  4. java在类中创建自己对象_java 在类中创建自己的对象

    public class A() { int yy=0; public static void main(String[] agrs) { A aa=new A(); } } 我想知道的是,A是一个类 ...

  5. String类中的equals方法与Object类中的equals方法的不同点

    1.首先我们看看Object类中的equals方法 public boolean equals(Object obj) {return (this == obj);} 我们可以看出Object类中判断 ...

  6. python中urframe函数的用法_python类中的内置函数

    __init__(): __init__方法在类的一个对象被建立时,马上运行.这个方法可以用来对你的对象做一些你希望的初始化.注意,这个名称的开始和结尾都是双下划线. 代码例子: #!/usr/bin ...

  7. python中property魔法方法原理_Python类中的魔法方法之 __slots__原理解析

    在类中每次实例化一个对象都会生产一个字典来保存一个对象的所有的实例属性,这样非常的有用处,可以使我们任意的去设置新的属性. 每次实例化一个对象python都会分配一个固定大小内存的字典来保存属性,如果 ...

  8. python中mod运算符_自定义 Python 类中的运算符和函数重载(上)

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 如果你对 Python 中的str对象使用过 + 或 * 运算符,你一定注意到了它的操作与 int 或 f ...

  9. java中的字段是_Java – 获取类中特定数据类型的字段

    原文链接作者:mkyong 译者:王乐(2270134103@qq.com) 一些Java反射API的例子. 1.显示所有字段和数据类型 使用反射遍历一个类声明的所有字段. CompanyA.java ...

最新文章

  1. Caffe---Pycaffe进行网络结构(xxx.prototxt)可视化
  2. 手写自己的MyBatis框架-语句执行处理
  3. Excel中插入VBA宏处理
  4. web.xml 中的listener、 filter、servlet 加载顺序
  5. [Leetcode][第309题][JAVA][最佳买卖股票时机含冷冻期][动态规划][压缩空间]
  6. 简述ip地址的abc类如何划分_面试官问:讲讲IP地址的分配原理
  7. k8s Service
  8. OpenCV3.1安装包下载
  9. HTML5浏览器兼容性解决方案
  10. Google I/O 大会强势回归!2021 中文直播全攻略看这里
  11. MATLAB中求某个函数的积分并绘图
  12. 荣耀linux电脑开机后黑屏,开机黑屏进不了系统,教您解决电脑开机黑屏进不了系统...
  13. html自动拨打电话,javascript之网页点击直接拨打电话和发送短信
  14. 【DEBUG】OMAPL138 Connect to PRSC failed
  15. loglog matlab,MATLAB 函数loglog()
  16. QGIS下载各种DEM的插件(SRTM 90m/30m -ALOS 30m -Cop 30m/90m-NASADEM Global DEM)
  17. Omni-ScaleFeatureLearningforPersonRe-Identification简记
  18. 数据结构之队列queue
  19. 自适应流媒体传输(五)——正确认识码率切换
  20. 2017年5月14日 星期日 --出埃及记 Exodus 26:2

热门文章

  1. duilib 子窗口位置_duilib各种布局的作用,相对布局与绝对布局的的意义与使用方法...
  2. rfid 标签内存_智能仓库之RFID仓库管理中的条形码与电子标签应用-RFID仓库管理功能与特点-新导智能...
  3. 2017.10.26 四校联测D1
  4. python中一个对象只能被一个变量引用吗_Python中for循环里的变量无法被引用的解决方法...
  5. 【英语学习】【Level 08】U01 Let's Read L5 You're a wizard, Harry.
  6. 【英语学习】【English L06】U05 Appointments L6 The experience of booking or canceling
  7. Android WebView:这是一份全面 详细的WebView学习指南
  8. sap idoc生成文件传到别的服务器,IDOC 实例详解
  9. stm32f103c8t6最小系统电路原理图_嵌入式单片机之STM32F103C8T6最小系统板电路设计参考...
  10. 裁剪平面ClipPlane