php 类中定义了一个public的方法,怎么知道这个方法是被类外调用的还是类内调用的
class Person
{
protected $name;
protected $hi;
protected $age;
public function __construct($name, $hi, $age)
{
$this->name = $name;
$this->hi = $hi;
$this->age = $age;
}
public function get($propertyName, $default = null)
{
if (...) { // TODO **判断如果是类外调用的**,且$propertyName === 'age'
throw new \InvalidArgumentException(spintf(
'%s access failed!',
$propertyName
));
}
if (isset($this->$propertyName) && $this->$propertyName !== null) {
return $this->$propertyName;
} else {
return $default;
}
}
public function getAge()
{
return $this->get('age', 18);
}
}
$xiaoMing = new Person('xiaoMing', 'I\'m xiaoMing', 20);
$xiaoMing->get('age'); // 抛异常
$xiaoMing->getAge(); // 20
现在我想解决的问题是:现在我想访问类内部属性统一通过get方法,在get方法里面类内部可以访问怎么$name, $hi, $age三个属性,类外部只能访问$name, $hi这两个属性,如果没有办法那我只能判断定义两个方法:
protected function insideGet($propertyName, $default = null); // 提供给内部使用
public function outsideGet($propertyName, $default = null); // 提供给外部使用
请大神帮忙解决这个问题,如果有更好的法案也请告知,谢谢
回复内容:
示例代码如下:
class Person
{
protected $name;
protected $hi;
protected $age;
public function __construct($name, $hi, $age)
{
$this->name = $name;
$this->hi = $hi;
$this->age = $age;
}
public function get($propertyName, $default = null)
{
if (...) { // TODO **判断如果是类外调用的**,且$propertyName === 'age'
throw new \InvalidArgumentException(spintf(
'%s access failed!',
$propertyName
));
}
if (isset($this->$propertyName) && $this->$propertyName !== null) {
return $this->$propertyName;
} else {
return $default;
}
}
public function getAge()
{
return $this->get('age', 18);
}
}
$xiaoMing = new Person('xiaoMing', 'I\'m xiaoMing', 20);
$xiaoMing->get('age'); // 抛异常
$xiaoMing->getAge(); // 20
现在我想解决的问题是:现在我想访问类内部属性统一通过get方法,在get方法里面类内部可以访问怎么$name, $hi, $age三个属性,类外部只能访问$name, $hi这两个属性,如果没有办法那我只能判断定义两个方法:
protected function insideGet($propertyName, $default = null); // 提供给内部使用
public function outsideGet($propertyName, $default = null); // 提供给外部使用
请大神帮忙解决这个问题,如果有更好的法案也请告知,谢谢
不知道怎么检查调用者,但是通常根本不需要这样处理。
你的逻辑思路为:使用get方法获取属性值,但是年龄需要特别处理,所以不能用get(age),而是应该调用特定的方法getAge。
实际上可以简化为:使用get方法获取属性值,如果该属性需要特别处理则返回指定方法的返回值。
代码示例:
public function get($propertyName, $default = null) {
if (method_exists($this, '_get' . $propertyName)) {
$method = '_get' . $propertyName;
return $this->$method($default);
}
if (isset($this->$propertyName) && $this->$propertyName !== null) {
return $this->$propertyName;
}
return $default;
}
protected function _getAge() {
if (! isset($this->age)) {
$this->age = 18;
}
return $this->age;
}
public function get($propertyName, $default = null)
{
if (...) { // TODO **判断如果是类外调用的**,且$propertyName === 'age'
throw new \InvalidArgumentException(spintf(
'%s access failed!',
$propertyName
));
}
return getInner($propertyName, $default);
}
protected function getInner($propertyName, $default = null)
{
if (isset($this->$propertyName) && $this->$propertyName !== null) {
return $this->$propertyName;
} else {
return $default;
}
}