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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-06 20:07:07
Original
1279 Leute haben es durchsucht

示例代码如下:

<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>
Nach dem Login kopieren
Nach dem Login kopieren

现在我想解决的问题是:现在我想访问类内部属性统一通过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>
Nach dem Login kopieren
Nach dem Login kopieren

现在我想解决的问题是:现在我想访问类内部属性统一通过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>
Nach dem Login kopieren

<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>
Nach dem Login kopieren
Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Aktuelle Ausgaben
PHP-Datenerfassung?
Aus 1970-01-01 08:00:00
0
0
0
PHP-Erweiterung intl
Aus 1970-01-01 08:00:00
0
0
0
Wie man PHP gut lernt
Aus 1970-01-01 08:00:00
0
0
0
Mehrere PHP-Versionen
Aus 1970-01-01 08:00:00
0
0
0
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage