OO PHP直接成员访问
我一直认为不应该直接设置/获取成员变量。例如OO PHP直接成员访问,php,oop,Php,Oop,我一直认为不应该直接设置/获取成员变量。例如 $x = new TestClass(); $x->varA = "test": echo $->varB; 我认为您应该始终使用对象方法来访问成员变量 但是我刚刚研究了uu set和u get,这意味着直接访问成员是可以的。在PHP5之前,您可以这样做。随着PHP5的引入,您可以声明私有变量。因此,直接访问变量的PHP4代码并不少见,因为私有变量没有规则。我认为直接访问类变量是可以的。如果您想阻止其他类修改这些变量,可以将它们设置为私
$x = new TestClass();
$x->varA = "test":
echo $->varB;
我认为您应该始终使用对象方法来访问成员变量
但是我刚刚研究了uu set和u get,这意味着直接访问成员是可以的。在PHP5之前,您可以这样做。随着PHP5的引入,您可以声明私有变量。因此,直接访问变量的PHP4代码并不少见,因为私有变量没有规则。我认为直接访问类变量是可以的。如果您想阻止其他类修改这些变量,可以将它们设置为私有。如果有一个公共getter和setter严格复制传递给类字段的值,我认为这是一种过于复杂的方法
我能想到的唯一一种使用getter或setter的情况是,您必须以某种方式处理值。从纯面向对象的角度来看,正确的做法是创建您自己的setter/getter方法(理想情况下通过重载PHP),使相关数据可用。(PHP有效地为您提供了带有uuu get和uuu set的通用版本,但它们可以让您获取/设置任何东西,这很可能并不理想。) 您还应该设置一个类中的所有变量(实际上是方法),使其具有正确的可见性(私有、受保护等),从而强制您使用set/get方法。请参阅手册:
魔术 函数名uuu-construct、uuu-destruct、uuuu-callStatic、uuu-get、uuu-set、uuu-isset、uuu-unset、uuuu-sleep、uuuu-wakeup、uuuuu-toString、uuuu-invoke、uuu-set和uuu-clone在PHP类中都很神奇。在任何类中都不能有具有这些名称的函数,除非您想要与它们关联的神奇功能。 小心 PHP保留所有以_u开头的函数名。建议不要在PHP中将函数名与_u一起使用,除非您需要一些文档化的神奇功能。 只需做好OOP(我建议您声明getter和setter,以防止直接访问变量…),并忘记uu get和u set。。如果我没有错的话,还有一个调用任意方法的调用。它们是神奇的方法,不适用于普通操作
您不应该使用uuu get和uuu set或uuu调用,除非您正在编写非常特殊的代码(使用一些框架,或用于代理调用其他对象的东西,如php库Javabridge) 这里没有正确的答案 在一开始,直接访问成员变量被认为是一个坏主意,因为您失去了使该访问以某组任意编程逻辑为条件的能力。这就是为什么我们害怕getter和setter方法 使用像
\uuu set
和\uu get
这样的神奇方法可以消除这种担忧。您可以让对象的用户访问所有您想要的成员变量,然后如果您发现需要一些围绕该访问的编程逻辑,您可以使用神奇的方法
但是,特别是在PHP中,\uuu set
和\uu get
从性能角度来看并不是免费的。另外,请记住,\uuu set
和\uu get
仅在访问不可访问(私有、受保护等)成员变量时调用。这意味着除了从类定义中删除成员变量之外,无法从类内调用\uuu set
和\uu get
,这会降低类的清晰度
像大多数PHP一样,没有明确的“最佳”处理方法 不仅在PHP中,而且在一般的面向对象编程中,如果一个类有成员变量,在访问这些变量时不需要执行代码,则不需要设置setter和getter,并且可以直接访问这些变量。如果对象的属性(变量)是公共的,那么访问这些属性(变量)是可以的 如果它们是protected/private(这在PHP5中是新的,在PHP4中是不存在的),您就不能直接访问它们 执行此操作或通过访问者取决于您需要/想要执行的操作:
- 如果您只想访问数据,则不需要访问器
- 如果要在访问数据时执行某些操作(例如,检查值的正确性),则应使用访问器--打赌maginc method
/\uuuu get
\uu set
- 使用这两种神奇方法的优点是对用户透明;您可以随时添加它们,而无需强迫用户重写代码
- 但是请注意,使用getter/setter据说是有成本的(当您谈到性能时,它会花费一些CPU,因为您必须调用一个方法)
- 当我不需要检查任何东西时,我不使用getter/setter
- 当我需要一些特殊行为时,我将变量声明为
受保护的
/
私有的
),并创建一个特殊的getter/setter(比如
/getName
- 这样做的好处是每个方法都有一个phpdoc,顺便说一句,在我使用的IDE中有提示