1.当获取或设置值时,Getters和setters提供了额外的灵活性。如果需要的话,你可以添加一个额外的逻辑层,如果你直接读取或写入一个公共属性,这是不可能的。你需要做的就是创建一个前缀为 get 或 set 的公共方法。属性的名称就成了后缀。惯例是让变量的第一个字母大写。因此,如果属性是 $testValue ,那么getter将是 getTestValue() 。
<?php
class GetSet
{
protected $intVal = NULL;
protected $arrVal = NULL;
// note the use of the null coalesce operator to return a default value
public function getIntVal() : int
{
return $this->intVal ?? 0;
}
public function getArrVal() : array
{
return $this->arrVal ?? array();
}
public function setIntVal($val)
{
$this->intVal = (int) $val ?? 0;
}
public function setArrVal(array $val)
{
$this->arrVal = $val ?? array();
}
}
4. 如果有一个有很多很多属性的类,为每个属性定义一个不同的getter和setter可能会变得很乏味。在这种情况下,你可以使用神奇的 __call() 方法定义一种回调。下面这个类定义了九个不同的属性。我们不必定义九个getter和九个setter,而是定义了一个方法 __call(),它可以确定使用方式是 get 还是 set。如果是 get,它从内部数组中检索键。如果是set,它将值存储在内部数组中。
// set date using a string
$a->setDate('2015-01-01');
var_dump($a->getDate());
// retrieves the DateTime instance
var_dump($a->getDate(TRUE));
// set date using a DateTime instance
$a->setDate(new DateTime('now'));
var_dump($a->getDate());
// retrieves the DateTime instance
var_dump($a->getDate(TRUE));
// create the instance
$a = new GetSet();
// set a "proper" value
$a->setIntVal(1234);
echo $a->getIntVal();
echo PHP_EOL;
// set a bogus value
$a->setIntVal('some bogus value');
echo $a->getIntVal();
echo PHP_EOL;
// NOTE: boolean TRUE == 1
$a->setIntVal(TRUE);
echo $a->getIntVal();
echo PHP_EOL;
// returns array() even though no value was set
var_dump($a->getArrVal());
echo PHP_EOL;
// sets a "proper" value
$a->setArrVal(['A','B','C']);
var_dump($a->getArrVal());
echo PHP_EOL;
try {
$a->setArrVal('this is not an array');
var_dump($a->getArrVal());
echo PHP_EOL;
} catch (TypeError $e) {
echo $e->getMessage();
}
echo PHP_EOL;