哪种方法更好实践?
$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();
通过方法或直接访问和设置对象变量是否更好? 用户是用户的对象模型。提前谢谢。
答案 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的“正确方法”。