Привет, ребята подскажите , не уверен что так можно но все же спрошу , как правильно обратится со статического метода к обычному свойству (не константа) ? к примеру PHP: publick $a; public static function b(){ return $this->$a; } можно конечно сделать свойство $a статическим и обратиться self::$a но как по мне не совсем красиво и я к примеру это свойство хочу в других не статических методах использовать как быть подскажите
@Evgenij85, статические свойства и статические методы - это свойства и методы, общие для всех экземпляров. Поэтому в статические методы не передаётся ссылка на экземпляр $this (да, на самом деле $this - это дополнительный скрытый параметр). Соответственно, чтоб получить доступ к полю объекта, надо его явно в статический метод передать через параметр, либо создать его внутри статического метода
Чисто теоретически можно, но это не красивее, чем self::$a и чувствую, что меня будут бить за то, что я вам такое показываю PHP: <?php class A { public $a = 'Hi'; public static function b() { return (new static)->a; } } echo A::b(); // Hi
если ничего не путаю обьект экземпляр класса , а класс это часть функциональности обьекта , чем это поможет в моем вопросе ?
Разные названия одного и того же - не есть определение. Хорошо, тогда так. Чем один объект класса А отличается от другого объекта класса А
Код (Text): class AffilatesLevel extends \yii\db\ActiveRecord { const CACHE_TIME = 60; const STATUS_ACTIVE = 1; public static $amount; public static $user; public static $user_main; /** * @inheritdoc */ public static function tableName() { return 'table_name'; } /** * @inheritdoc */ public function rules() { return [ [['interest_rate', 'status'], 'integer'], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'id' => 'ID', 'interest_rate' => 'Interest Rate', 'status' => 'Status', ]; } public static function getAll() { if (!$arr = Yii::$app->cache->get('affilates_All')) { $arr = array(); $values = static::find()->where(['status' => self::STATUS_ACTIVE])->asArray()->all(); foreach ($values as $value) { $arr[$value['id']] = [$value['interest_rate']]; } Yii::$app->cache->set('affilates_All', $value = $arr, self::CACHE_TIME ); } return $arr; } /** * @param $level * @return mixed * Метод кеширования.Ожидаем ид уровня, а отдаем процент уровня. */ public static function getValueInterest($level) { if (!$value = Yii::$app->cache->get('affilates_level_interest')){ Yii::$app->cache->set('affilates_level_interest', $value = static::getAll(), self::CACHE_TIME ); } return $value[$level][0]; } /** * @param $level * @return mixed * Метод кеширования.Ожидаем ид уровня, а отдаем статус уровня. */ public static function getValueStatus($level) { if (!Yii::$app->cache->get('affilates_level_status')){ $model = static::find()->all(); $arr = array(); foreach ($model as $value){ $arr[$value->id] = [$value->status]; } Yii::$app->cache->set('affilates_level_status', $arr,self::CACHE_TIME ); } else{ $arr = Yii::$app->cache->get('affilates_level_status'); } return $arr[$level][0]; } /** * Метод проверяет активность уровня если уровень выше отключен соотвественно уровень ниже не может работать * Расчет с первого уровня * $level - входящий параметр это уровень * возвращает true или false * $level integer */ public static function getActiveLevel($level) { if ($level == 1){ if (self::getValueStatus(1) == 1){ return true; } } if ($level == 2){ if (self::getValueStatus(1) == 1 && self::getValueStatus(2)==1){ return true; } } if ($level == 3){ if (self::getValueStatus(1) == 1 && self::getValueStatus(2)==1 && self::getValueStatus(3)==1){ return true; } } if ($level == 4){ if (self::getValueStatus(1) == 1 && self::getValueStatus(2)==1 && self::getValueStatus(3)==1 && self::getValueStatus(4)==1){ return true; } } if ($level == 5){ if (self::getValueStatus(1) == 1 && self::getValueStatus(2)==1 && self::getValueStatus(3)==1 && self::getValueStatus(4)==1 && self::getValueStatus(5)==1){ return true; } } if ($level == 6){ if (self::getValueStatus(1) == 1 && self::getValueStatus(2)==1 && self::getValueStatus(3)==1 && self::getValueStatus(4)==1 && self::getValueStatus(5)==1 && self::getValueStatus(6)==1){ return true; } } return false; } /** * Метод получает всех id юзеров и id_affiliate * с данным масивом мы сможем работать когда будем проверять существуют партнеры ниже по уровню или нет * Ключ массива есть id основного user значение это affilates_id * Пример массива array(14) { [1]=> NULL [18]=> int(31) [21]=> int(18) [22]=> int(21) [78]=> NULL [79]=> NULL * [80]=> int(0) [81]=> int(80) [82]=> int(81) [83]=> int(82) [84]=> int(83) [85]=> int(84) [86]=> int(85) [87]=> int(81) } */ public static function getBelow() { if (!$levels = Yii::$app->cache->get('cache_level_below')) { $levels = ArrayHelper::map(User::find()->select('id, user_affiliate_id')->asArray()->all(),'id', 'user_affiliate_id'); Yii::$app->cache->set('cache_level_below', $levels, self::CACHE_TIME); } return $levels; } /** * @param $id ид юзера * @return mixed * Метод возвращает юзернейм пользователя * */ public static function getUserName($id) { if (!$levels = Yii::$app->cache->get('chanche_level_username')) { $levels = ArrayHelper::map( User::find()->select('id, username')->asArray()->all(),'id', 'username'); Yii::$app->cache->set('chanche_level_username', $levels, self::CACHE_TIME); } if(!isset($levels[$id])){ return 'undefended'; } return $levels[$id]; } /** * Распределение по реферальной программе * $user - обьект юзера который сделал пополнение , далее ищем кто подключал реффералов и начисляем им бонусы в * зависимости от уровня реферальной программы. * $amount сумма на которую пополнил $user * $namePaymentSystem название платежной системы */ public static function distributionReferralProgram($user, $amount = 0.00, $namePaymentSystem = '') { if(!is_object($user) && !is_numeric($amount) && !is_string($namePaymentSystem)){ return false; } if(Settings::getSettingsValue('aff_onoff') != '1'){ //включаем партнерскую программу return false; } self::$user = $user; self::$amount = (float)$amount; $count_level = count(self::getAll()); for ($i = 1; $i <= $count_level; $i++){ if(AffilatesLevel::getActiveLevel($i) && self::$user->user_affiliate_id != null){ $refAmount = self::$amount * (AffilatesLevel::getValueInterest($i) / 100); self::$user_main = User::findOne(self::$user->user_affiliate_id); if (!empty(self::$user)) { self::$user_main->power += $refAmount; self::$user_main->save(); $aff = new Affiliates(); $aff->amount = $amount; $aff->aff_amount = $refAmount; $aff->aff_amount_usd = $refAmount; $aff->aff_level = $i; $aff->user_id = self::$user->user_affiliate_id; $aff->ref_user_id = self::$user->id; $aff->comment = 'For you charged from referal ' . self::$user->username; $aff->payment_system = $namePaymentSystem; $aff->payment_amount = self::$amount ; if($aff->save(false)){ self::$user = self::$user_main; } } }else{ break; } } //for end return true; } и у меня получается много статики из-за того что использую много в Views , может конечно во многом не прав но нужно развиваться , то что я уточнял последний метод distributionReferralProgram() я обращался к статическим свойствам , но код мне не нравится, готов выслушать всю критику по коду
Так а зачем тебе здесь сообще сохранять в статическую переменную? Используй ту, что передается в параметрах? Ты понимаешь, что если после вызова этого метода, вызвать другой метод, в котором задействовать переменную self::$user, например, она будет заполнена? Статические переменные в классе - это альтернатива глобальным переменным. И вообще, с таким подходом, если перенести код из AffilatesLevel::distributionReferralProgram() функцию AffilatesLevel_distributionReferralProgram() абсолютно ничего не изменится. Это не ООП. И в amount используй целое.
Ну вот я объект класса "человек", и вы объект класса "человек", мы ничем не отличаемся? Или всё таки каждый своего роста, с разной длинной различных органов? Вот это всё (рост, длина всяких органов) - соответственно, нестатические свойства (потому что у всех разные). А какой-нибудь там показатель количества женщин на земле, или количество китайцев - это статические свойства, общие для всех экземпляров класса человек
в продолжении нашего диалога я пытаюсь уйти от статических методов , подскажите насколько будет правильно использовать обычный метод а к нему обращаться статическим методом к примеру через (new self())->personalInterestProduct($id, $short) и не будит ли это потери скорости или увеличении памяти ? Код (Text): public function personalInterestProduct($id, $short) { $this->columnName = $short.'_'.$id; if ($this->personal == null){ $this->personal = self::find()->where(['user_id'=>12])->asArray()->One(); } if(is_array($this->personal) && !array_key_exists($this->columnName, $this->personal)){ return 0; } if($this->personal[$this->columnName] == 0){ return 0 ; } return (float)$this->personal[$this->columnName] / 100 ; } public static function getPersonalInterestProduct($id,$short) { return (new self())->personalInterestProduct($id, $short); }
не делай ооп ради ооп. ооп упрощает сложные проекты, а ты усложняешь. Зачем тебе здесь создавать отбъект? И используй не self а static
если обращаюсь через return static:ersonalInterestProduct($id, $short); у меня ругается на this в методе personalInterestProduct Ошибка : Using $this when not in object context из ошибки я так понимаю что он начинает воспринимать метод personalInterestProduct как статический http://prntscr.com/ifi5s2
я писал, что надо испольовать вместо self - static. https://secure.php.net/manual/ru/language.oop5.late-static-bindings.php В твоем случае надо сначала разобраться с пониманием что такое объект и зачем он нужен, потом рефакторить код.