我想更好地了解OOP的基本概念。 什么是面向对象编程静态和动态的变量和方法? 是什么,例如,使用$这与双冒号(之间的区别::)?
$这($这个 - > a_method())
- 好处: ?。
- 缺点:? ......“这”不是自我记录为:
$this->method_from_an_extended_class()
双冒号(:: SomeClass的a_method())
- 好处: ?
- 缺点:?
我想更好地了解OOP的基本概念。 什么是面向对象编程静态和动态的变量和方法? 是什么,例如,使用$这与双冒号(之间的区别::)?
$this->method_from_an_extended_class()
“静态”和“动态”是不是,正确的描述。
->
表示一个实例函数或实例数据 ,这意味着函数或数据具有一个隐含的$this
参考。 把它放在你指的是函数或变量的特定对象中的另一种方式。
::
表示一类函数或类变量 。 这是非常相似,在全局函数或变量不存在隐$this
参考。 那类份额函数或变量的所有实例。
“动态”是,比如说一个更准确的描述, PHP超载在那里你可以“动态”创建变量,例如,用魔术方法__get()
和__set()
这是所谓的当您试图访问一个属性,无法找到;你可以重载这些方法基本上假装请求的成员存在)。
引述静态页面PHP手册 :
声明类属性或方法为静态,使他们无需类的实例访问 。 声明为静态属性不能与实例化的类对象(尽管一个静态方法可以)进行访问。
还要注意的是声明一个属性为静态时,会出现只有一个为整个脚本版本属性:静态方法/属性“行为在类级别,而不是在实例级别”(引自维基百科 )。
关于优势/劣势,这是一个有点难以回答清楚,那些都是不一样而已...
现在的问题是:你需要什么?
如果你有一个包含数据的对象,并想方法来处理这些数据,你会使用动态属性和方法。
在另一方面,如果你只是想用一个类容器与外部数据(即没有内置类)的处理方法,你可能会使用静态方法。
举例来说,我有时候用静态方法作为包装到不出口的面向对象的API库:它让我打电话给一个class::method
,而不是几个功能。
有人会说的静态方法的“好处”是,你不需要实例化类使用它们 - 这是真实的; 但它也意味着你没有得到的对象,以对他们的工作方法; 好:正如我所说,使用静态与否取决于你所需要的。
哦,我差点忘了:如果你愿意使用单元测试,你可能会发现,静态方法不容易测试; 例如,参照静态方法死亡可测性 。
和静态特性(同同单和注册表的设计模式,它依赖于静态属性/方法)那种意味着“全局状态”,如“全局变量” -其中一些不太喜欢^^