Heim >Backend-Entwicklung >PHP-Tutorial >php 类中定义了一个public的方法,怎么知道这个方法是被类外调用的还是类内调用的
示例代码如下:
<code>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 </code>
现在我想解决的问题是:现在我想访问类内部属性统一通过get方法,在get方法里面类内部可以访问怎么$name, $hi, $age三个属性,类外部只能访问$name, $hi这两个属性,如果没有办法那我只能判断定义两个方法:
protected function insideGet($propertyName, $default = null); // 提供给内部使用
public function outsideGet($propertyName, $default = null); // 提供给外部使用
请大神帮忙解决这个问题,如果有更好的法案也请告知,谢谢
示例代码如下:
<code>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 </code>
现在我想解决的问题是:现在我想访问类内部属性统一通过get方法,在get方法里面类内部可以访问怎么$name, $hi, $age三个属性,类外部只能访问$name, $hi这两个属性,如果没有办法那我只能判断定义两个方法:
protected function insideGet($propertyName, $default = null); // 提供给内部使用
public function outsideGet($propertyName, $default = null); // 提供给外部使用
请大神帮忙解决这个问题,如果有更好的法案也请告知,谢谢
不知道怎么检查调用者,但是通常根本不需要这样处理。
你的逻辑思路为:使用get方法获取属性值,但是年龄需要特别处理,所以不能用get(age),而是应该调用特定的方法getAge。
实际上可以简化为:使用get方法获取属性值,如果该属性需要特别处理则返回指定方法的返回值。
代码示例:
<code>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; }</code>
<code>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; } }</code>