OOP中的静态和动态变量/方法是什么?

时间:2009-09-13 10:46:30

标签: php oop dynamic static-members

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

之间的区别是什么

$ this($ this-> a_method())

  • 优点:?。
  • 缺点:? ......“这个”不是自我记录,如:$this->method_from_an_extended_class()

双冒号(someclass :: a_method())

  • 优点:?
  • 缺点:?

2 个答案:

答案 0 :(得分:6)

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

->表示实例函数实例数据,这意味着函数或数据具有隐式$this引用。换句话说,你指的是特定对象中的函数或变量。

::表示类函数类变量。这与全局函数或变量非常相似,因为没有隐式$this引用。该类的所有实例共享该函数或变量。

“动态”会更准确地描述,例如PHP overloading,您可以“动态”创建变量,例如,使用魔术方法__get()__set()(其中)当您尝试访问无法找到的属性时调用;您可以重载这些方法以基本上假装所请求的成员存在)。

答案 1 :(得分:1)

引用static page in the PHP manual

  

声明类属性或方法   静态使它们可以访问   无需实例化   班级。声明为的财产   静态无法访问   实例化的类对象(虽然是   静态方法可以)

另请注意,在将属性声明为静态时,整个脚本只有该属性的一个版本:静态方法/属性“在类级别而不是在实例级别”(引用{ {3}})


关于优点/缺点,有点难以清楚地回答,因为那些不一样......

问题是:你需要什么?

如果您有一个包含数据的对象,并且想要处理该数据的方法,那么您将使用动态属性和方法。

另一方面,如果你只想使用一个类作为处理外部数据(即,不是类的内部)的方法的容器,你可能会使用静态方法。
例如,我有时使用静态方法作为不导出Oriented-Object API的库的包装:它允许我调用一个class::method,而不是几个函数。


有些人会说静态方法的一个“优点”是你不需要实现类来使用它们 - 这是真的;但它也意味着你没有得到物体,方法就是它们;好吧:正如我所说,使用静态或不使用静态取决于你需要什么。

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

静态属性(与单例和注册表设计模式相同,依赖于静态属性/方法)有点暗示“全局状态”,比如“全局变量” - 有些不是非常喜欢^^