PHP 静态方法和静态属性

时间:2018-11-15 15:16:38  来源:igfitidea点击:

在本教程中,我们将学习PHP静态方法和静态属性。同时将介绍$this和self之间的区别,并讨论何时可以使用静态方法。

PHP静态方法和静态属性介绍

有时候,我们想在类的上下文中而不是在对象中访问方法和属性,那么就可以使用static关键字。

要将静态方法添加到类中,可以使用static关键字,如下所示:

public static function static_method(){
    // 方法的实现
}

在方法的可见性之前或之后放置static关键字都可以。但是,按照惯例,首先声明可见性(public,private,protected)。

要将静态属性添加到类中,您还可以使用static关键字:

private static $static_property;

静态方法和静态属性没有链接到类的任何特定对象,而是链接到类本身。

要在类外部调用静态方法,可以使用::操作符,如下所示:

MyClass::static_method();

要在类外部访问公共的静态属性,也是使用::操作符:

MyClass::$static_property;

但是,要从类的实例内部访问静态方法和静态属性,需要使用self而不是$this,如下所示:

<?php
class MyClass{
    private static $static_property;
    
    public static function static_method(){
    //...
    }
    
    public function method(){
        self::$static_property;
        self::static_method();
    }
}

self 和 $this 的对比

新的PHP面向对象编程开发人员可能有时会混淆self和$this。这里让我们做一个比较:

$thisself
表示类的一个实例或者对象表示一个类
永远以符号$开头从不以$符号开头
后面是->操作符后面是::操作符
->操作符后面的属性名不带$符号,
例如$this->property
::操作符后面的属性名总是带有$符号。
例如self::$property

PHP静态方法和静态属性示例

下面的例子演示了如何使用静态方法和静态属性:

<?php

class Counter {

    private $count;
    public static $instance;

    public function __construct($count = 0) {
        $this->count = $count;
        self::$instance++;
    }

    public function count() {
        $this->count++;
        return $this;
    }

    public function __toString() {
        return (string) $this->count;
    }

    public static function countInstance() {
        return self::$instance;
    }

}

$c1 = new Counter();
$c1->count()
        ->count();
echo '计数器1的值: ' . $c1 . '<br/>';

$c2 = new Counter();
$c2->count()
    ->count()
    ->count();

echo '计数器2的值: ' . $c2 . '<br/>';

echo '计数器的数量:'
 . Counter::countInstance()
 . '<br/>';

什么时候使用静态方法?

在定义静态方法之前,问自己一个问题:“在不实例化新对象的情况下直接调用方法是否有意义?””。
如果某个逻辑可以由类的多个实例共享,则可以提取相应的代码并将其放入静态方法中。

PHP静态方法通常用于PHP框架中的utility类。utility类是只包含静态方法的类。