什么时候在php中使用静态变量/函数?
我正在用PHP刷新OOP,我看到了一个将函数和/或变量设置为静态的示例。何时以及为什么要将变量/函数设置为static?我曾经使用过其他语言,但我不记得使用过静态语言,我从来没有发现它的真正用途。我知道它做什么,但为什么不使用变量呢?静态函数和变量用于访问全局范围内的变量/函数,如下所示:什么时候在php中使用静态变量/函数?,php,oop,static,Php,Oop,Static,我正在用PHP刷新OOP,我看到了一个将函数和/或变量设置为静态的示例。何时以及为什么要将变量/函数设置为static?我曾经使用过其他语言,但我不记得使用过静态语言,我从来没有发现它的真正用途。我知道它做什么,但为什么不使用变量呢?静态函数和变量用于访问全局范围内的变量/函数,如下所示: echo myClass::myVariable; echo myClass::myFunction(); 当某个东西是静态的时,它可以在任何地方访问,并且非常类似于过程类型函数,只是它可以使用self并且
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.
}
因为它有一个私有构造函数,所以不能用new
操作符实例化它,所以您必须调用myClass::get\u connection()
来获取一个类。该函数可以生成新类(因为它是该类的成员)。然后它将类存储在一个静态变量中,如果您再次调用该函数,它将简单地返回创建的类
最后,static关键字被用来保持事物的静态,比如范围。这意味着您不希望由于当前范围而发生任何“更改”。虽然Singleton方法稍微扩展了这一点,但它保持了一个相同的想法,即无论您在什么范围内,您总是拥有“相同”的类
PHP文档堆栈溢出知识
不过,这里有一个随机的例子 从职位: 实例方法是实例方法,因为它们依赖于状态 特定对象实例的。实例方法与 特定实例,因为该方法调用的行为 依赖于该特定实例的状态 当您将一个方法声明为静态时,您将该方法定义为 类方法。类方法应用于类,而不是任何 具体实例。类方法引发的行为不会 不依赖于特定实例的状态。事实上,一个静态的 方法不能依赖实例的状态,因为静态方法缺少 访问此参考。相反,类方法的行为 或者取决于所有对象在类级别共享的状态, 或者完全独立于任何国家 如果方法依赖于对象实例的状态,那么它应该是 实例方法。如果一个方法对所有实例都是通用的,或者没有实例 类,并且不依赖于对象状态,它应该是静态的 方法。实例方法是最常用的。无论多么静态 方法对于实用程序类和工厂类非常有用 其他用途 当您希望使用未绑定到实例的方法/变量时,可以使用static。当:
- 这与您的目的和实例无关(对于那些不允许像Java这样的OOP的语言中的工具箱很有用,但在PHP中不有用)
- 您希望控制对实例的访问。通常,您想要处理的实例在编写代码时没有定义,而是在执行时定义。这是最好的例子。您可以使用静态方法作为工厂,根据上下文或与其他实例共享资源来创建对象。例如:静态成员可以授予对数据库层的访问权限,因此应用程序的一部分可以从任何地方访问同一个数据库层,并且该应用程序的打开/关闭没有冲突
- 性能很重要,该方法将被执行很多次。在这种情况下,您将节省一些CPU时间,防止解释器在每次调用时查找实例的成员。但是,如果perfs成为这样一个问题,您需要使用这个解决方案,那么可能需要重新考虑您的体系结构,或者在代码的关键部分使用与更快语言的绑定
- 您有一个与某个类型相关但将应用于另一个类型的方法。将方法写入第一种类型的声明中是有意义的,但将其设置为静态,因为它需要另一种类型的实例
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");
此外,如果经常调用某个方法并执行相同的操作,则它对于缓存非常有用,例如:
/**
* Returns true if the user is logged in through shibboleth
*
* @return boolean true on success, else false
*/
protected function is_logged_in() {
//Check shibboleth headers
if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) {
if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) {
return true;
}
}
return false;
}
此方法将在我的框架内经常调用,在那里它将为每次调用执行数据库查找,以查找我的配置$\u服务器密钥
因此,在处理页面时,我在一次页面加载中调用了10次,它将有10次数据库调用,但我将其更改为:
/**
* Returns true if the user is logged in through shibboleth
*
* @return boolean true on success, else false
*/
protected function is_logged_in() {
static $logged_in = null;
if($logged_in != null) {
return $logged_in;
}
//Check shibboleth headers
if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) {
if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) {
$logged_in = true;
return true;
}
}
$logged_in = false;
return false;
}
因此,如果我登录并缓存结果,它只需检查一次每个页面加载的正常行为。下次它将只返回缓存的值。
我经常使用此功能来提高性能
希望这能有所帮助。访问:
静态方法只不过是名称空间的全局函数。名称空间,我认为我们都可以同意,是伟大的。至于全局函数:我们一直在使用它们。PHP中的本机函数构成了我们的基本构建块
通常,使用静态功能,您可以优化速度和内存,方法的范围不应更改,其性质应是静态的,您可以访问对象的静态属性、方法,而无需启动它们,从而节省内存。如果您想与所有实例共享数据,类似于当前执行时创建的实例数计数器。静态元素具有许多有用的特征