时间:2021-07-01 10:21:17 帮助过:5人阅读
- <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>