php中的static

静态成员是一种类变量,可以把它看成时属于整个类而不是属于类的某个实例。与一般的实例变量不同的是,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效的,也就是说,所有的实例共享这个成员。

$this只表示类的当前实例,而 self:: 表示的是类本身,在类之外的代码中不能使用这个操作符,而且它不能识别自己在继承树层次结构中的位置。也就是说,在扩展类中使用self 作用域时,self 可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。与$this不同的是,在使用静态变量时,必须在作用域限定符后面加上$符号。

在扩展类中,在基类的方法被重写的情况下,使用 parent 作用域调用定义在基类中的方法。静态成员也可以只属于父类。如果在子类和父类中同时声明了某个成员,也可以使用parant::在子类中访问父类中的变量。在这种情况下,父类的静态成员和子类的静态成员保存的是不同的值。

可以在 :: 操作符的左边写上类的名称来静态地访问某个成员,这样避免创建类的实例。不仅省略掉实例化类的代码,而且还会更高效,因为类的每个实例都会占用一小部分的系统资源。

在使用 :: 操作符访问成员变量时,需要再次注意对$符号的使用。因为PHP当前不支持动态的静态变量的使用,也就是说不支持可变的静态变量。在使用$this->$var时,被访问的成员是包含在$var中的变量的值。而不用$符号访问某个变量实际上查找的是类的某个常量,而常量是不能通过$this来访问的。

PHP6中提出的static::作用域使我们不再需要使用self::和parent::。当希望指向最终的实现功能的类时,就可以使用static::,这个限定符会在代码执行之前立即计算出继承层次机构上最后那个类的成员。之一过程被称为延迟绑定,它使我们可以在子类中重写某个静态变量,并且也可以从某个在父类中声明的函数中反问这个最终成员。

有时,可能有必要创建供所有类实例共享的字段和方法,这些字段和方法与所有的类实例有关,但不能由任何特定对象调用。例如,假设要编写一个类,跟踪网页访问者的数量。你一定不希望每次实例化该类时都把访问者数量重置为0 ,此时就可以将该字段设置为static作用域:

<?php
    class visitors
    {
        private static $visitors = 0;
        function __construct()
        {
             self::$visitors++;
        }
        static function getVisitors()
        {
            return self::$visitors;
        }
    }
    /* Instantiate the visitors class. */
    $visits = new visitors();
    echo visitors::getVisitors()."";
    /* Instantiate another visitors class. */
    $visits2 = new visitors();
    echo visitors::getVisitors()."";
?>



程序运行结果:

1

2

因为$visitors字段声明为static,所以对其值的任何改变都会反映到所有实例化对象中。还要注意,静态字段和方法应使用self关键字和类名来引用,而不是通过this和箭头操作符。这是因为使用“正常”方法引用静态字段是不可能的,会导致语法错误。

不能在类中使用$this来引用为static字段。

静态变量

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

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

静态方法

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索类的实例化
, 实例
, 变量
, 静态
, static 成员变量
, 方法
, 类成员变量
, static 静态变量
, 字段
, #静态变量值生存周期
, 成员
, 类静态变量
, 作用域实例
类的静态变量
php中static的作用、php中static、php class中static、php static、php static 变量,以便于您获取更多的相关知识。

时间: 2024-08-04 12:26:38

php中的static的相关文章

Java中的static关键字解析

static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题. 以下是本文的目录大纲: 一.static关键字的用途  二.static关键字的误区  三.常见的笔试面试题 一.static关键字的用途   在<Java编程思想>P86页有这样一段话: "static方法就是没有this的方法.在st

Java中的static的使用指南_java

一.Java中的static使用之静态变量 1.Java 中被static修饰的成员称为静态成员或类成员.它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享.且优先于对象存在.静态成员可以使用类名直接访问,也可以使用对象名进行访问.使用 static 可以修饰变量.方法和代码块. 2.public 修饰符表示公开的.公有的,静态变量使用static修饰 3.静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员. public class HellWorld{ String

java static-假设有一个类,我只对这个类的引用做一个声明,那么这个类中的static方法会被初始化吗

问题描述 假设有一个类,我只对这个类的引用做一个声明,那么这个类中的static方法会被初始化吗 假设下面这种情况,test1中的do方法会被初始化吗? public class test{ public static void main(string []args){ test1 t: } } class test1{ int i: static void do(){} } 解决方案 第一次访问的含义是,访问了这个静态类中的任何方法.属性.字段,那么所有的属性都会被初始化. 解决方案二: 方法

【类中的static变量在栈中吗?】

问题描述 [类中的static变量在栈中吗?] 解决方案 在静态区中,是一个独立的区域,和堆.栈并列的 解决方案二: 数据区,跟全局变量等在一个sector 解决方案三: 局部变量: 栈区 局部静态变量:静态区 全局变量: 静态区的常量区 全局静态变量:静态区 内存分四个区:静态区,栈区,堆区,代码区 解决方案四: 当然不在,类中的一切变量都在堆上.堆栈上只有函数的局部变量. 解决方案五: 这个其实很好理解,都不需要死记硬背,也不需要看书. 一说你就明白了.为什么要堆栈?因为函数允许嵌套调用,所

java代码-java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的?

问题描述 java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的? class Demo03 { public static void main(String[] args) { A.show(); } } class A { //构造方法 A(){ System.out.println("构造方法执行"); System.out.println(b); System.out.println(c); } static A a=new A(); sta

eclipse中的static web project 是什么项目?

问题描述 eclipse中的static web project 是什么项目? 如题:上一张图 解决方案 跟前端一样,不过用eclipse写前端有点不好,还是用专业的比较好一些 解决方案二: 静态web项目,不包含jsp 解决方案三: Eclipse新建项目dynamic web project与static web project有什么区别maven项目,web项目的eclipse相关的.classpath,.projecteclipse的安装过程和Web project项目的创建 解决方案四

实例分析Java中public static void main(String args[])是什么意思_java

本文实例讲述了Java中public static void main(String args[])的来龙去脉.分享给大家供大家参考,具体如下: public static void main(String[] args) 这绝对不是凭空想出来的,也不是没有道理的死规定,而是java程序执行的需要. jvm在试图运行一个类之前,先检查该类是否包含一个特殊方法.这个方法必须是公有的,以便在任何位置都能访问得到.这个方法必须是static的,因为这个方法不能依赖任何该类的实例即可运行,而非stati

C/C++中的static关键字的总结

C/C++中static的2种设计和5种使用方法 面向过程程序设计中的static和面向对象程序设计中的static 具体应用的话,又涉及静态变量和静态函数两类 前者应用于普通变量(变量又分局部变量和全部变量)和函数,不涉及类:后者主要说明static在类中的作用. 因此结构关系如下,那么我们具体来分析 面向过程程序设计中的static 静态局部变量,成为静态局部变量(拥有记忆功能和全局存储权限) 静态全局变量(限制对应全局变量被被其他文件调用) 静态函数 面向对象程序设计中的static. 静

java中的static的用法

问题描述 java中的static的用法 为什么我不在class Book前面加static 这个代码会报错list.add(new Book(123, "java编程思想")); 加上之后就不会报错了 解决方案 BOOk只是内部类,静态方法在类加载时加载,其他的在实例化类时加载, 也就是main加载在book之前,不能调用不存在的东西吧 解决方案二: Java之static用法(详解)java中static的用法(一)静态成员变量Java Static 用法总结 解决方案三: 鼠标放