直接或通过函数访问对象变量更好吗?

时间:2010-11-03 08:57:31

标签: php oop

  

可能重复:
  Why use getters and setters?

哪种方法更好实践?

$user = new User();
$user->username = "bob";
$user->password = "password";
$user->age = 42;

echo $user->username;

VS

$user = new User();
$user->setUsername("bob")->setPassword("password")->setAge(42);

echo $user->getUsername();

通过方法或直接访问和设置对象变量是否更好? 用户是用户的对象模型。提前谢谢。

3 个答案:

答案 0 :(得分:2)

最好使用封装,这是OOP的最大优势之一。将属性设为私有,并使用setter和getter访问属性。

如果使用setter,则可以在为属性设置值之前进行检查。例如: 如果你想确保$ id属性是一个整数,你可以在你的setter中检查它。如果您使用直接访问属性,则不能。如果要更改属性的检查,只需在一个位置更改它。

因为使用setter是你要走的路,所以你也应该使用getter,否则你仍然可以在不使用setter的情况下设置你的属性。

请查看神奇的__set()和__get()方法,以便在设置器和getter时让您的生活更轻松。

有关__set和__get(以及其他魔术方法)的更多信息: http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

修改

我同意戈登的观点。但是值得注意的是使用魔术方法的可能性。

@Axsuul: 定义属性时,请使用private,public或protected关键字。例如:

protected $id;

private $id;

http://php.net/manual/en/language.oop5.visibility.php

“类属性必须定义为public,private或protected。如果使用var声明而没有显式可见性关键字,则该属性将被定义为public。”

没有更改默认可见性的选项。

答案 1 :(得分:2)

对setter使用私有属性使您有机会对属性实现一些基本验证,因此如果(例如)名称和密码是必需的,您可以检查它们是否使用有效值调用,如果不是则抛出异常。否则,您必须在代码中的其他位置执行此操作。

强制使用getter还允许您在返回值之前执行其他任务(例如,格式化电话号码,或确保名称以大写的第一个字符显示)。

这有很多好处,因为如果您选择更改密码规则,那么显而易见的地方就是这样做...如果在代码的其余部分中从多个位置调用密码设置,那么它就是单点验证逻辑。

答案 2 :(得分:0)

使用方法(getter和setter,将属性设为私有)是名为encapsulation的“正确方法”。