Home >Backend Development >PHP Tutorial >php 类中定义了一个public的方法,怎么知道这个方法是被类外调用的还是类内调用的

php 类中定义了一个public的方法,怎么知道这个方法是被类外调用的还是类内调用的

WBOY
WBOYOriginal
2016-06-06 20:07:071240browse

示例代码如下:

<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>
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn