首頁 php教程 php手册 关于php 静态变量与静态方法

关于php 静态变量与静态方法

May 25, 2016 pm 04:49 PM
php 變數 靜態 靜態方法

很多朋友可能分不清楚在php中静态变量与静态方法的用法与区别在哪里,下面我来根据自己的经验来介绍静态变量与静态方法一些理解。

在PHP中,静态变量的解释是存在于类作用域的变量,在第一次初始化时给变量赋值,以后类初始化时,静态变量将不会再被重新赋值,主要用于一个类具有多个实例时的变量共享.

使用静态变量

变量范围的另一个重要特性是静态变量(static variable),静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失,看看下面的例子:

演示需要静态变量的例子,代码如下:

<?php
function Test() {
    $a = 0;
    echo $a;
    $a++;
}
?>
登入後複製

本函数没什么用处,因为每次调用时都会将 $a 的值设为 0 并输出 "0",将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了,要写一个不会丢失本次计数值的计数函数,要将变量 $a 定义为静态的:

使用静态变量的例子,代码如下:

<?php
function Test() {
    static $a = 0;
    echo $a;
    $a++;
}
?>
登入後複製

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

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

静态变量与递归函数,代码如下:

<?php
function Test() {
    static $count = 0;
    $count++;
    echo $count;
    if ($count < 10) {
        Test();
    }
    $count--;
}
?>
登入後複製

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

声明静态变量,代码如下:

<?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
class Fruit {
    public static $category = "I&#39;m fruit";
    static function find($class) {
        $vars = get_class_vars($class);
        echo $vars[&#39;category&#39;];
    }
}
class Apple extends Fruit {
    public static $category = "I&#39;m Apple";
}
Apple::find("Apple");
//程序运行结果:1 I&#39;m Apple

?>
登入後複製

Program List:重写基类方法,在派生类重写基类的方法,代码如下:

<?php
class Fruit {
    static function Foo($class = __CLASS__) {
        call_user_func(array(
            $class,
            &#39;Color&#39;
        ));
    }
}
class Apple extends Fruit {
    static function Foo($class = __CLASS__) {
        parent::Foo($class);
    }
    static function Color() {
        echo "Apple&#39;s color is red";
    }
}
Apple::Foo(); // This time it works.
//程序运行结果:Apple&#39;s color is red

?>
登入後複製

Program List:静态数组的使用

静态和const作用域都可以用::操作符访问,如果你想使用::操作符访问数组,你需要事先将数组声明为静态,代码如下:

<?php
class Fruit {
    static $color = array(
        &#39;color1&#39; => &#39;red&#39;,
        &#39;color2&#39; => &#39;yellow&#39;
    );
}
class Apple {
    public function __construct() {
        var_dump(Fruit::$color);
    }
}
class Banana {
    public function __construct() {
        Fruit::$color = FALSE;
    }
}
new Apple(); // prints array(2) { ["color1"]=> string(3) "red" ["color2"]=> string(6) "yellow" }
echo &#39;<br />&#39;;
new Banana();
new Apple(); // prints bool(false)

?>
登入後複製

Program List:再来一个单例模式,Static真的很酷,下面的程序演示了如何获得一个已经存在的实例,代码如下:

<?php
class Singleton {
    private static $instance = null;
    private $value = null;
    private function __construct($value) {
        $this->value = $value;
    }
    public static function getInstance() {
        if (self::$instance == null) {
            echo "<br>new<br>";
            self::$instance = new Singleton("values");
        } else {
            echo "<br>old<br>";
        }
        return self::$instance;
    }
}
$x = Singleton::getInstance();
var_dump($x); // returns the new object
$y = Singleton::getInstance();
var_dump($y); // returns the existing object

?>
登入後複製

例,静态变量与静态方法,代码如下:

<?php
class A {
    static $i = 10;
    public function set($n) {
        self::$i = $n;
    }
    public function get() {
        return self::$i;
    }
}
$a = new A();
$a->set(11);
$a1 = new A();
echo $a1->get();
?>
登入後複製

输出结果为11,可以看到类A在第二次实例化后,静态变量$i依然与上一次实例化时后设定的$i值是一致的,用java来解释,其实就是一个类的静态变量在多个实例中都使用了一个内存空间,我觉得这样解释更加便于理解,因为静态变量和静态方法不需要实例化就可以使用,因而在文件被加载后静态变量就会初始化,而静态方法则会被注册。这也就可以理解,为什么java类的入口会这样的了,代码如下:

public static void main(String[] args){}

我以前一直觉得由于静态方法不需要实例化就可以直接使用,节约了实例化的巨大开销,因而在使用一个类的方法时我更加倾向于直接静态调用而避免实例化。对于这个问题,我与同事已经争论过很多次,他不主张静态调用主要有以下想法:

1.实例化类更加符合面向对象编程的思想;

2.静态调用方法并不能在消耗上有较大的节约。

对于这个问题,我还是坚持自己的观点,但也并不是无论什么时候都使用静态调用,我主要有以下想法:

1.由于静态变量在文件被载入时就会被初始化,因此如果有多个类,并且类中存在多个静态变量与方法,势必在还未实例化时已消耗较多的内存(未验证),所以对于访问不频繁或特殊需要,不建议将一个方法设为static;

2.对于调用较为频繁的类,我强烈建设使用static静态和静态方法,不仅可以共享内存空间,还可以共享数据。细心就会发现目前主流的PHP框架的基类都是使用的静态调用方法。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

CakePHP 日期和時間 CakePHP 日期和時間 Sep 10, 2024 pm 05:27 PM

為了在 cakephp4 中處理日期和時間,我們將使用可用的 FrozenTime 類別。

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

為了進行文件上傳,我們將使用表單助理。這是文件上傳的範例。

CakePHP 建立驗證器 CakePHP 建立驗證器 Sep 10, 2024 pm 05:26 PM

可以透過在控制器中新增以下兩行來建立驗證器。

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 是一個開源MVC 框架。它使應用程式的開發、部署和維護變得更加容易。 CakePHP 有許多函式庫可以減少大多數常見任務的過載。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

See all articles