我在var pin1 = "7460";
console.log(pin1); //7460
中具有虚拟属性的方法/功能:
Model1
如何在class Model1 {
public $virtattr;
public $_virtattr;
public function getVirtattr () {
if (isset($this->_virtattr)) {
return $this->_virtattr;
}
return $this->_virtattr = str_ireplace('x1', 'x2', $this->virtattr);
}
}
中调用此方法以得到相同的结果?
我正在尝试这种方式,但不幸的是它没有用,因为我得到的结果是空的:
Model2
您能指出我正确的方向吗?
答案 0 :(得分:0)
对象编程的重点是封装-Model1
不会神奇地使用Model2
中的属性,只是因为您在Model1
内部实例化了Model2
。 Model1
将使用其自己的属性,因此(new Model1())->getVirtattr()
不会触摸Model2
中的属性。
如果要在两个类之间共享相同的逻辑,则可以使用继承:
class Model1 {
public $virtattr;
public $_virtattr;
public function getVirtattr() {
if ($this->_virtattr !== null) {
return $this->_virtattr;
}
return $this->_virtattr = str_ireplace('x1', 'x2', $this->virtattr);
}
}
class Model2 extends Model1 {
}
然后Model1::getVirtattr()
和Model2::getVirtattr()
将使用相同的实现。
如果无法继承,则可以使用traits在两个单独的类之间共享相同的实现:
trait VirtattrTrait {
public $virtattr;
public $_virtattr;
public function getVirtattr() {
if ($this->_virtattr !== null) {
return $this->_virtattr;
}
return $this->_virtattr = str_ireplace('x1', 'x2', $this->virtattr);
}
}
class Model1 {
use VirtattrTrait;
}
class Model2 {
use VirtattrTrait;
}