在PHP中动态更改属性

时间:2019-05-03 15:34:36

标签: php oop attributes

我对OOP有一些抽象的知识,但这是我第一次尝试用PHP编写一些OOP。我想创建一个类,该类将具有一些构造属性,但某些属性会动态变化。

我对所有术语(对象,类,方法等)感到困惑,因此我不知道确切要搜索什么。我在下面做了一个简化的例子。

这是我声明我的类的地方,它将在构造中接受2个参数并计算第三个参数,即更高的数字(请忽略我不检查类型)。

class test{
  public function __construct($p1, $p2){
    $this->p1 = $p1;
    $this->p2 = $p2;
    $this->p_max = max(array($this->p1, $this->p2));
  }
}

然后我初始化对象并检查 p_max

$test = new test(1,2);
echo $test->p_max; // Prints 2

但是如果我更改 p1 p2 p_max 不会更改:

$test->p1 = 3;
$test->p2 = 4;
echo $test->p_max; // Prints 2 (I want 4)

在每次更改 p1 p2 时,应该如何在班级内部定义 p_max 进行更新?有没有一种方法可以不将 p_max 转换为方法?

2 个答案:

答案 0 :(得分:1)

您可以使用魔术__get方法来实现,如果访问了一个类的属性但未定义该属性,则该方法将被调用。在我看来,这是很棘手的,但是可以按照您的意愿来工作。

<?php
class test {
    public function __construct($p1, $p2) {
        $this->p1 = $p1;
        $this->p2 = $p2;
    }

    public function __get($name) {
        if ('p_max' === $name) {
            return max(array($this->p1, $this->p2));
        }
    }
}

$test = new test(1,2);
echo $test->p_max; // Prints 2

$test->p1 = 3;
$test->p2 = 4;
echo $test->p_max; // Prints 4

这样,每次访问此属性时,都会计算出最大值。

编辑:因为__get方法只会为类本身未定义的属性调用,所以如果您在构造函数中为变量分配值或创建该属性,此方法将无效作为财产。

Edit2 :我想再次指出-用这种方式很难做到。为了获得更清洁的方式,请遵循AbraCadaver的答案。这也是我个人的做法。

答案 1 :(得分:1)

您实际上不需要使用魔术方法,只需使用一种返回计算值的方法即可:

class test{
  public function __construct($p1, $p2){
    $this->p1 = $p1;
    $this->p2 = $p2;
  }    

  public function p_max() {
    return max($this->p1, $this->p2);
  }
}

$test->p1 = 3;
$test->p2 = 4;
echo $test->p_max(); // call method

您还可以接受p_max()的可选参数来设置新值并返回计算出的值:

class test{
  public function __construct($p1, $p2){
    $this->p1 = $p1;
    $this->p2 = $p2;
  }    

  public function p_max($p1=null, $p2=null) {
    $this->p1 = $p1 ?? $this->p1;
    $this->p2 = $p2 ?? $this->p2;

    return max($this->p1, $this->p2);
  }
}

echo $test->p_max(3, 4); // call method

还要注意,max接受多个参数,因此您不必指定数组。