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