我什么时候在php中使用静态变量/函数?

2022-08-30 08:39:11

我正在用PHP刷新OOP,我看到了一个将函数和/或变量设置为静态的示例。何时以及为何将变量/函数设置为静态?我做过其他语言,并不记得曾经使用过静态,我从来没有找到它的真正目的。我知道它的作用,但为什么不直接使用变量呢?


答案 1

当您要使用未绑定到实例的方法/变量时,请使用静态。这可能发生在以下情况下:

  • 这与你的目的和实例没有关系(对于不允许像Java这样的其他任何OOP的语言的工具箱很有用,但在PHP中没有用)。

  • 您希望控制对实例的访问。大多数情况下,要处理的实例不是在编写代码时定义的,而是在执行时定义的。单例模式就是最好的例子。您可以使用静态方法作为工厂,根据上下文创建对象或与其他实例共享资源。例如:静态成员可以授予对数据库层的访问权限,因此应用程序的一部分从任何地方访问相同的基础层,并且打开/关闭它而不会发生冲突。

  • 表演很重要,方法会执行很多次。在这种情况下,您将节省一些 CPU 时间,防止解释器在每次调用时将成员查找到实例。但是,如果性能成为您找到此解决方案的问题,那么可能是时候重新考虑您的体系结构,或者对代码的关键部分使用绑定到更快的语言。

  • 您有一个与某个类型相关但将应用于另一个类型的方法。将方法写入第一种类型的声明中是有意义的,但将其设置为静态,因为它需要另一种类型的实例。

完美的例子是字符串解析器:

class MyObject 
{
 static function parse($str)
 {
    $obj = new MyObject();
    // some parsing/setting happens here
    return $obj;
 }
}

// you create an object "MyObject" from a string, so it's more obvious
// to read it this way :
$new_obj = MyObject::parse("This a description of a super cool object");

答案 2

静态函数和变量用于访问全局范围内的变量/函数,如下所示:

echo myClass::myVariable;
echo myClass::myFunction();

当某些内容是静态的时,它可以在任何地方访问,并且与过程类型函数非常相似,除了它可以使用self并且包含在类作用域中。

class myClass{
    static $myVariable = "myVar";
    static function myFunction()
    {
       return "myFunc";
    }
}

使用此方法的方法之一是仅保留类的一个实例或单例方法。

class myClass
   {
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new myClass;
        }
        else
        {
            return self::$class;
        }
    }
    private function __construct()
    {
         // my constructor
    }
    // Then create regular class functions.
   }

因为它有一个私有构造函数,所以它不能用运算符实例化,所以你被迫调用来获取一个类。该函数可以创建新类(因为它是该类的成员)。然后,它将该类存储在静态变量中,如果再次调用该函数,它将仅返回创建的类。newmyClass::get_connection()

最后,static关键字用于保持事物,嗯,静态,参考范围。这意味着您不希望由于当前范围而发生任何“更改”。虽然 Singleton 方法稍微扩展了这一点,但它始终遵循相同的想法,即您始终拥有“相同”的类,无论您处于什么范围内。

PHP 文档
静态关键字
作用域解析运算符

StackOverflow 知识
如何避免使用 PHP 全局对象
在 PHP 中的函数之间共享变量 而不使用全局
使全局变量对于类
中的每个函数都可访问 对于数据库连接
PHP 类的全局全局或单PHP 类:何时使用 :: vs. -> ?


推荐