我对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 转换为方法?
答案 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
接受多个参数,因此您不必指定数组。