php中static静态类与static 静态变量用法区别

1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/function,前提是该变量/方法可访问。
2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以。但是有前提条件:
A. 如果是变量,需要该变量可访问。
B. 如果是方法,除了该方法可访问外,还需要满足:
b1) 如果是静态方法,没有特殊条件;
b2) 如果是非静态方法,需要改方法中没有使用$this,即没有调用非静态的变量/方法,当然,调用静态的变量/方法没有问题。

然后我们再看一下使用$object->… 和使用class::… 都有什么区别:
1. 使用$object->… ,需要执行构造函数创建对象;
2. 使用class::… 调用静态方法/变量,不需要执行构造函数创建对象;
3. 使用class::… 调用非静态方法/变量,也不需要执行构造函数创建对象。

然后奇怪的地方就出来了,既然2和3都一样,那静态方法/变量存在还有什么意义呢?
静态 static
声明类成员或方法为 static ,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外)。静态成员属于类,不属于任何对象实例,但类的对象实例都能共享。

例子:

 代码如下 复制代码

<?php
Class Person{
    // 定义静态成员属性
    public static $country = "中国";
    // 定义静态成员方法
    public static function myCountry() {
        // 内部访问静态成员属性
        echo "我是".self::$country."人<br />";
    }
}
class Student extends Person {
    function study() {
        echo "我是". parent::$country."人<br />";
    }
}
// 输出成员属性值
echo Person::$country."<br />";  // 输出:中国
$p1 = new Person();
//echo $p1->country;   // 错误写法
// 访问静态成员方法
Person::myCountry();   // 输出:我是中国人
// 静态方法也可通过对象访问:
$p1->myCountry();

// 子类中输出成员属性值
echo Student::$country."<br />"; // 输出:中国
$t1 = new Student();
$t1->study();    // 输出:我是中国人
?>

运行该例子,输出:

中国
我是中国人
我是中国人
中国
我是中国人
小结
在类内部访问静态成员属性或者方法,使用 self::(注意不是 $slef),如:

 代码如下 复制代码
slef:: $country
slef:: myCountry()

在子类访问父类静态成员属性或方法,使用 parent::(注意不是 $parent),如:

 代码如下 复制代码
parent:: $country
parent:: myCountry()

外部访问静态成员属性和方法为 类名/子类名:: ,如:

 代码如下 复制代码
Person::$country
Person::myCountry()
Student::$country

但静态方法也可以通过普通对象的方式访问。

例子 声明静态变量

 代码如下 复制代码

<?PHP
   function foo(){
   static $int = 0;// correct
   static $int = 1+2;   // wrong (as it is an expression)
   static $int = sqrt(121); // wrong (as it is an expression too)
  
   $int++;
   echo $int;
   }
   ?>

例子 使用静态变量的例子

 代码如下 复制代码
<?PHP
   function Test()
   {
   static $w3sky = 0;
   echo $w3sky;
   $w3sky++;
   }
   ?>

现在,每次调用 Test() 函数都会输出 $w3sky 的值并加一。

静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止:

例子 静态变量与递归函数

 代码如下 复制代码

<?PHP
   function Test()
   {
   static $count = 0;
  
   $count++;
   echo $count;
   if ($count < 10) {
   Test();
   }
   $count--;
   }
   ?>

注: 静态变量可以按照上面的例子声明。如果在声明中用表达式的结果对其赋值会导致解析错误。

更多关于php静态变量用法

时间: 2024-10-18 12:53:52

php中static静态类与static 静态变量用法区别的相关文章

php中静态类与静态变量用法区别解析

 static是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了.   1. 创建对象$ob ject = new Class(),然后使用"->"调用:$ob ject->attribute/function,前提是该变量/方法可访问.   2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以,但是有前提条件. A. 如果是变量,需要该变量可访问. B. 如果

php中静态类与静态变量用法的区别分析_php技巧

本文实例分析了php中静态类与静态变量用法的区别.分享给大家供大家参考.具体分析如下: static是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了. 1. 创建对象$object = new Class(),然后使用"->"调用:$object->attribute/function,前提是该变量/方法可访问. 2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态

asp.net application static静态变量用法

asp教程.net application static静态变量用法 File: Global.asax <%@ Application Language="C#" ClassName="Global" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Collections.Generic" %> <

遍历-二叉树递归中,将递增的静态变量最后变回零,怎么做?

问题描述 二叉树递归中,将递增的静态变量最后变回零,怎么做? //按照前序遍历序列建立二叉树 void CreateBTree_Pre(BTNode *&root, DataType Array[]) { static int count=0; //静态变量count char item=Array[count];//读取Array[]数组中的第count个元素 count++; if(item == '#') //如果读入#字符,创建空树 { root = NULL; return ;} el

全局变量与全局静态变量的区别

全局变量与全局静态变量的区别: (a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别. (b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的. 静态全局变量的作用: (a)不必担心其它源文件使用相同变量名,彼此相互独立. (b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改. 例如:一个程序由两个源文件组成,其中在一个源文件中定义了"int n;",在另一个源

python实现类的静态变量用法

  这篇文章主要介绍了python实现类的静态变量用法,实例分析了Python中基于数组实现静态队列的相关使用技巧,需要的朋友可以参考下 这里使用静态变量目的是在类中实现一个静态的队列,这里用数组实现,任何时候插入到队列中的数据不会和类的实例有直接关系. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 __author__ = 'Administrator' class CaptchaImage: def queue(self,arr=list()): return arr de

php中静态类与静态变量用法的区别分析

 static是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了. 1. 创建对象$object = new Class(),然后使用"->"调用:$object->attribute/function,前提是该变量/方法可访问. 2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以,但是有前提条件. A. 如果是变量,需要该变量可访问. B. 如果是方法,除了

C/C++中全局变量和静态变量的区别

1. 全局变量的作用域是整个项目,它只需要在一个源文件中定义就可以作用于所有的源文件,其它不包括全局变量定义的文件需要用extern关键字再次声明这个全局变量. 2. 全局变量.静态全局变量.静态局部变量都是在静态存储区(全局数据区)中分配空间的,而局部变量是在栈上分配空间的. 3. 全局变量.静态变量的生命期和程序生命期是一样的,在程序结束之后操作系统会回收空间. 4. 全局变量和静态变量都是保存在静态存储区中,生命期和程序一样,但是不同的是全局变量的作用域是整个项目,而静态全局变量是当前程序

asp.net中静态变量和非静态变量的区别

静态变量:静态变量使用 static 修饰符进行声明在所属类被装载时创建通过类进行访问所属类的所有实例的同一静态变量都是同一个值非静态变量:不带有 static 修饰符声明的变量称做非静态变量在类被实例化时创建通过对象进行访问同一个类的不同实例的同一非静态变量可以是不同的值示例: [复制到剪贴板]CODE: using System;using System.Collections.Generic;using System.Text;namespace Example01{    class P