OO PHP直接成员访问

时间:2009-07-27 15:57:47

标签: php oop etiquette

我一直认为你不应该直接设置/获取成员变量。 E.g。

$x = new TestClass();
$x->varA = "test":
echo $->varB;

我认为你总是使用对象方法来访问成员变量。

但我一直在看__set和__get,这意味着可以直接访问成员。

7 个答案:

答案 0 :(得分:3)

这里没有正确答案。

一开始,直接访问成员变量被认为是一个坏主意,因为你失去了使某些任意编程逻辑的条件访问成为条件的能力。这就是为什么我们对吸气剂和制定者方法的恐惧。

使用__set__get等魔术方法可以消除这种担忧。您可以让对象的用户访问成员变量,然后如果您发现需要一些关于该访问的编程逻辑,则可以使用魔术方法。

但是,特别是在PHP中,__set__get从性能角度来看并不是免费的。此外,请记住,__set__get仅在访问不可访问(私有,受保护等)成员变量时调用。这意味着除了从类定义中删除成员变量之外,无法从类中调用__set__get,这会使您的类变得不那么清晰。

像大多数PHP一样,没有明确的“最佳”方法来处理这个问题。

答案 1 :(得分:2)

不仅在PHP中,而且在一般的面向对象编程中,如果一个类具有成员变量,在访问它们时不需要执行代码,则不需要创建setter和getter,并且可以直接访问变量

答案 2 :(得分:1)

如果对象的属性(变量)是公共的,则可以访问它们的属性(变量)。

如果它们是受保护/私有的(这是PHP 5中的新功能,PHP 4中不存在),则无法直接访问它们。

执行此操作或访问访问者取决于您需要/想要执行的操作:

  • 如果您只想访问数据,则不需要访问者
  • 如果你想在访问数据时执行某些操作(例如检查值是否正确),你应该使用访问器 - 不管它是否为__get / __set
  • 使用这两种魔术方法的优点是对用户来说是透明的;并且您可以随时添加它们,而不必强迫用户重写代码。
  • 但是请注意,使用getter / setter会产生成本(当你谈论性能时需要花费一些CPU,因为你必须调用方法)

最后,没有“正确的方式”,没有“最好的方式”:有两种方式,由您决定哪种方式最符合您的需求。

对于我自己的项目,这是我一般做的事情:

  • 当我不需要检查任何东西时,我不使用getter / setters
  • 当我需要一些特殊行为时,我将变量声明为protected / private,并创建一个特殊的getter / setter(如getName / setName
    • 这样做的好处是每个方法都有一个phpdoc,并在我使用的IDE中提示,btw

答案 3 :(得分:0)

在PHP 5之前,你可以这样做。随着PHP 5的引入,您可以声明私有变量。因此,看到直接访问变量的PHP 4代码并不罕见,因为私有变量没有规则。

答案 4 :(得分:0)

我认为直接访问类变量是可以的。如果您想让其他类不修改这些变量,可以将它们设为私有。如果你有一个公共getter和setter严格复制传递给class字段的值,我认为这只是过于复杂的方法。

我能想到你想要使用getter或setter的唯一情况是你必须以某种方式处理这个值。

答案 5 :(得分:0)

从纯粹的OO角度来看,正确的做法是创建自己的setter / getter方法(理想情况下通过重载PHP),使相关数据可用。 (PHP有效地为你提供了__get和__set的泛型版本,但是这些可以让你获得/设置任何东西,这很可能并不理想。)

您还应该在类中设置所有变量(实际上是方法)以获得正确的可见性(私有,受保护等),从而迫使您使用set / get方法。

答案 6 :(得分:0)

查看手册:
http://us2.php.net/manual/en/language.oop5.magic.php

Magic Methods
The function names __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state and __clone are magical in PHP classes. You cannot have functions with these names in any of your classes unless you want the magic functionality associated with them. 

Caution
PHP reserves all function names starting with __ as magical. It is recommended that you do not use function names with __ in PHP unless you want some documented magic functionality. 

做好OOP(我建议你声明getter和setter不要直接访问变量..)并忘记__get和__set ..如果我没有错,那么还有一个__call用于调用任意方法。它们是MAGIC它们不适用于普通操作的方法。

你不应该使用__get和__set或__call,除非你正在编写非常特殊的代码(某些框架,或代理调用其他对象的东西,如php库Javabridge http://php-java-bridge.sourceforge.net/)。