0

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

$this ($this->a_method())

  • 好处: ?。
  • 缺点:? ...“this”不是自记录的,如:$this->method_from_an_extended_class().

双冒号(someclass::a_method())

  • 好处: ?
  • 缺点:?
4

2 回答 2

6

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

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

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

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

于 2009-09-13T11:04:13.560 回答
1

引用PHP 手册中的静态页面

将类属性或方法声明为静态使它们无需实例化即可访问。不能用实例化的类对象访问声明为静态的属性(尽管静态方法可以)

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


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

问题是:你需要什么?

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

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


有人会说静态方法的“优点”是您不需要实例化类来使用它们——这是真的;但这也意味着你没有得到对象,方法是在它们上面工作;好吧:正如我所说,是否使用静态取决于您的需要。

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

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

于 2009-09-13T10:49:11.717 回答