Yii2 调用 method/function 不同的模型
Yii2 call method/function of a different model
我在Model1
中有一个method/function的虚拟属性:
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
中调用此方法以获得相同的结果?
我以这种方式尝试但不幸的是它不起作用,因为我得到的结果是空的:
use Model1;
class Model2 {
public $virtattr;
public $_virtattr;
public function getVirtattr () {
return (new Model1)->getVirtattr();
}
}
你能给我指明正确的方向吗?
对象编程的重点是封装 - 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()
将使用相同的实现。
如果继承不是 possible/preferred,您可以使用 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;
}
我在Model1
中有一个method/function的虚拟属性:
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
中调用此方法以获得相同的结果?
我以这种方式尝试但不幸的是它不起作用,因为我得到的结果是空的:
use Model1;
class Model2 {
public $virtattr;
public $_virtattr;
public function getVirtattr () {
return (new Model1)->getVirtattr();
}
}
你能给我指明正确的方向吗?
对象编程的重点是封装 - 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()
将使用相同的实现。
如果继承不是 possible/preferred,您可以使用 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;
}