匿名用户
1级
2013-07-05 回答
将成员变量私有化,并使用公有接口去访问,是为了保证数据的正确性,保证对象能够正常工作。
对象有两个作用,一是保存数据,二是拥有操作数据的方法。对象就是一个黑盒子,隐藏数据操作细节,而我们可以轻松地处理和取得数据,不需要了解内部的处理过程。对象的数据只由它自己去处理,没有外部干涉,这样的数据是安全的可信任的。
如果我们能够任意改变对象的数据,就是对其密封性的破坏。在"外力"的作用下,对象拥有的数据类型和值发生改变,很可能会影响其内部的处理过程,严重时会发生错误。
示例一:
class Division{
public $a;
public $b;
public function __construct($a, $b) {
if ($b == 0)
throw new Exception('division by zero!');
$this->a = $a;
$this->b = $b;
}
public function run() { return $this->a / $this->b; }
}
$a = new Division(5, 5);
$a->b = 0;
$a->run(); // 出错了,因为除数被设为了0在上例中,虽然构造函数对传入的变量经行了过滤,但由于变量是公有的,用户“不小心”更改了$b的值,造成了程序异常。
使用函数来访问变量,可以对变量经行预处理,防止用户传入了不合法的值。这就像是在对象的前面加上了一道“防火墙”,保证程序正常地工作。
示例二:
class A{
public function call() { echo 'A->call() is calling!'; }
}
class B{
private $_a;
public function setA(A $a) {
if (!is_callable($a, 'call'))
throw new Exception('A->call() is not callable!');
$this->_a = $a;
}
public function call() {
if ($this->_a)
$this->_a->call();
}
}在上例中,属性$a是私有的,只能通过setA()方法来设置。setA()方法中使用了PHP的“类型提示”功能,这就要求传入的参数必须是A的实例。在函数中的代码又检查了$a对象是否含有可以调用的$a->call()方法,如果失败就会抛出异常。从而保证了传入变量的正确性。
希望能帮到您~也希望能够及时采纳~