в словаре нельзя так хранить вызов функции ?
UnboundLocalError: local variable 'a' referenced before assignment
class A
{
private $internalPrice; // скрытое свойство
private $coefficient; // скрытое свойство
public $externalPrice;
private function getCoefficient() //скрытый метод
{
return 10;
}
private function getInternalPrice()
{
return $this->a;
}
public function getExternalPrice()
{
$coeff = $this->getCoefficient();
$innerPrice = $this->getInternalPrice();
$this->externalPrice = $innerPrice * $coeff;
return $this->externalPrice;
}
};
$foo = new A();
echo $foo->internalPrice; // фатальная ошибка, никто не сможет посмотреть внутреннюю цену
или поменять так:
$foo->internalPrice = 28; // фатальная ошибка
echo $foo->coefficient; // фатальная ошибка, те же причины, свойство объявлено как приватное
// зато
echo $foo->getExternalPrice() // работает
//или вы можете расширить класс, и если хотите изменить коэффициент, написать публичный метод в классе.
public setCoefficient($coeff)
{
$this->coefficient = $coeff;
}
// тогда
$foo->setCoefficient(15); // никакой ошибки, но при попытке изменить напрямую
$foo->coefficient = 15; // по прежнему фатальная ошибка
// чем менять метод расчета внешней цены (повлечет за собой изменения везде), вы можете расширить класс и написать метод расчета цены для друзей:
public function getPriceForFriends()
{
// например, так:
$externalPrice = $this->getExternalPrice();
return $externalPrice - 100;
// в этом случае от посторонних глаз скрыто как именно происходит расчет скидки для друзей, и мы напрямую не меняем коэффициенты, внутреннюю цену, методы расчета.
}
Болшая вероятность, что с помощью select_related и prefetch_related можно сократить количество запросов многократно.