Полезно, чтобы методы, определенные внутри признаков, имели доступ к общему объему свойств, например, методы, определенные в одном и том же объекте. Однако есть ли способ, чтобы две черты могли использовать одно и то же имя свойства, но каждое свойство было бы в другой области видимости, поэтому setTwo()
не будет перезаписывать $this->data
из trait one
и наоборот?
пример:
<?php
namespace one;
trait one {
public function setOne($data) {
$this->data = $data;
}
public function getOne()
{
return $this->data;
}
}
namespace two;
trait two {
public function setTwo($data) {
$this->data = $data;
}
public function getTwo()
{
return $this->data;
}
}
namespace bar;
class Bar {
use \one\one;
use \two\two;
}
$bar = new Bar;
$bar->setOne(1);
$bar->setTwo(2);
echo "Bar getOne: " . $bar->getOne() . '<br>' . PHP_EOL; // echoes 2 instead of wanted 1
echo "Bar getTwo: " . $bar->getTwo() . '<br>' . PHP_EOL; // overwrites $this->data = 1 with 2
echo "Bar->data: " . $bar->data . '<br>' . PHP_EOL;
Причина, по которой я ищу отдельную область видимости, заключается в том, что для имен общих свойств, таких как: сумма, результат, кэш, в какой-то момент вы можете непреднамеренно перезаписать их при составлении класса из многих черт.
Единственное, что мне приходит в голову, - это использовать промежуточный класс (который имеет собственное пространство имен и, следовательно, свою собственную область видимости), составленный из черт, и передать его как зависимость другому классу, который нуждается некоторые функции черт, используемых для промежуточного состава. В приведенном выше примере мне понадобятся два промежуточных класса - один с чертой один, другой с чертой два.
Есть ли другие варианты, кроме промежуточного класса или изменения в каждой черте $this->data
на более специальные имена типа $this->dataOne
и $this->dataTwo
?