什么是OOP的静态和动态变量/方法?(What are static and dynamic var

2019-08-05 17:11发布

我想更好地了解OOP的基本概念。 什么是面向对象编程静态和动态的变量和方法? 是什么,例如,使用$这与双冒号(之间的区别::)?

$这($这个 - > a_method())

  • 好处: ?。
  • 缺点:? ......“这”不是自我记录为: $this->method_from_an_extended_class()

双冒号(:: SomeClass的a_method())

  • 好处: ?
  • 缺点:?

Answer 1:

“静态”和“动态”是不是,正确的描述。

->表示一个实例函数实例数据 ,这意味着函数或数据具有一个隐含的$this参考。 把它放在你指的是函数或变量的特定对象中的另一种方式。

::表示一类函数类变量 。 这是非常相似,在全局函数或变量不存在隐$this参考。 那类份额函数或变量的所有实例。

“动态”是,比如说一个更准确的描述, PHP超载在那里你可以“动态”创建变量,例如,用魔术方法__get()__set()这是所谓的当您试图访问一个属性,无法找到;你可以重载这些方法基本上假装请求的成员存在)。



Answer 2:

引述静态页面PHP手册 :

声明类属性或方法为静态,使他们无需类的实例访问 。 声明为静态属性不能与实例化的类对象(尽管一个静态方法可以)进行访问。

还要注意的是声明一个属性为静态时,会出现只有一个为整个脚本版本属性:静态方法/属性“行为在类级别,而不是在实例级别”(引自维基百科 )。


关于优势/劣势,这是一个有点难以回答清楚,那些都是不一样而已...

现在的问题是:你需要什么?

如果你有一个包含数据的对象,并想方法来处理这些数据,你会使用动态属性和方法。

在另一方面,如果你只是想用一个类容器与外部数据(即没有内置类)的处理方法,你可能会使用静态方法。
举例来说,我有时候用静态方法作为包装到不出口的面向对象的API库:它让我打电话给一个class::method ,而不是几个功能。


有人会说的静态方法的“好处”是,你不需要实例化类使用它们 - 这是真实的; 但它也意味着你没有得到的对象,以对他们的工作方法; 好:正如我所说,使用静态与否取决于你所需要的。

哦,我差点忘了:如果你愿意使用单元测试,你可能会发现,静态方法不容易测试; 例如,参照静态方法死亡可测性 。

和静态特性(同同单和注册表的设计模式,它依赖于静态属性/方法)那种意味着“全局状态”,如“全局变量” -其中一些不太喜欢^^



文章来源: What are static and dynamic variables / methods in OOP?