我试图更好地理解 OOP 中的基本概念。面向对象编程中的静态和动态变量和方法是什么?例如,使用 $this 与使用双冒号 (::) 有什么区别?
$this ($this->a_method())
- 好处: ?。
- 缺点:? ...“this”不是自记录的,如:
$this->method_from_an_extended_class()
.
双冒号(someclass::a_method())
- 好处: ?
- 缺点:?
我试图更好地理解 OOP 中的基本概念。面向对象编程中的静态和动态变量和方法是什么?例如,使用 $this 与使用双冒号 (::) 有什么区别?
$this->method_from_an_extended_class()
.“静态”和“动态”不是正确的描述。
->
表示实例函数或实例数据,表示该函数或数据具有隐式$this
引用。换句话说,您指的是特定对象中的函数或变量。
::
表示类函数或类变量。这与没有隐式$this
引用的全局函数或变量非常相似。该类的所有实例共享该函数或变量。
“动态”将是更准确的描述,例如PHP 重载,您可以“动态”创建变量,例如,使用魔术方法__get()
和__set()
(当您尝试访问无法找到的属性时调用它们;您可以重载这些方法以实质上假装请求的成员存在)。
引用PHP 手册中的静态页面:
将类属性或方法声明为静态使它们无需实例化即可访问。不能用实例化的类对象访问声明为静态的属性(尽管静态方法可以)。
另请注意,当将属性声明为静态时,整个脚本只有该属性的一个版本:静态方法/属性“在类级别而不是在实例级别执行” (引用wikipedia)。
关于优点/缺点,很难清楚地回答,因为那些不一样......
问题是:你需要什么?
如果您有一个包含数据的对象,并且想要处理该数据的方法,您将使用动态属性和方法。
另一方面,如果您只想将类用作处理外部数据(即,不是类内部数据)的方法的容器,您可能会使用静态方法。
例如,我有时使用静态方法作为不导出 Oriented-Object API 的库的包装器:它允许我调用一个class::method
,而不是几个函数。
有人会说静态方法的“优点”是您不需要实例化类来使用它们——这是真的;但这也意味着你没有得到对象,方法是在它们上面工作;好吧:正如我所说,是否使用静态取决于您的需要。
哦,我差点忘了:如果你愿意使用单元测试,你可能会发现静态方法不容易测试;例如,请参阅Static Methods are Death to Testability。
静态属性(与依赖静态属性/方法的单例和注册表设计模式相同)有点暗示“全局状态”,如“全局变量”——有些人不太喜欢 ^^