Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OO PHP直接成员访问_Php_Oop - Fatal编程技术网

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中有提示

您如何知道访问哪些成员变量时需要执行代码?当您设计时。无论如何,你可以随时更改源代码。Java/C#和其他“经典”OOP语言有自己的原因不直接访问成员变量,这不仅仅是PHP4的事情。直接访问变量(如$x->varA=“Test”)不同于使用php神奇的方法uuu set和u get。魔法方法的存在并不意味着你应该使用它们。由于反射api的存在,并不意味着您必须访问 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.