Динамически изменяемый атрибут в PHP - PullRequest
0 голосов
/ 03 мая 2019

У меня есть некоторые абстрактные знания ООП, но я впервые пытаюсь написать код ООП в PHP.Я хочу создать класс, который будет иметь некоторые атрибуты из конструкции, но некоторые атрибуты, которые динамически изменяются.

Я немного запутался во всех терминах (объекты, классы, методы, ...), поэтому я неточно знать, что искать.Я сделал упрощенный пример ниже.

Здесь я объявил свой класс, который примет 2 параметра при построении и вычислит третий, который является более высоким числом (пожалуйста, игнорируйте, что я не проверяю тип).

class test{
  public function __construct($p1, $p2){
    $this->p1 = $p1;
    $this->p2 = $p2;
    $this->p_max = max(array($this->p1, $this->p2));
  }
}

Затем я инициализирую объект и проверяю p_max :

$test = new test(1,2);
echo $test->p_max; // Prints 2

Но если я изменю p1 и p2 , p_max не изменится:

$test->p1 = 3;
$test->p2 = 4;
echo $test->p_max; // Prints 2 (I want 4)

Как мне определить p_max внутри моего класса для обновления при каждом изменении p1 или p2 ?Есть ли способ, не превращая p_max в метод?

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Вам не нужно использовать магический метод, просто метод, который возвращает вычисленное значение:

class test{
  public function __construct($p1, $p2){
    $this->p1 = $p1;
    $this->p2 = $p2;
  }    

  public function p_max() {
    return max($this->p1, $this->p2);
  }
}

$test->p1 = 3;
$test->p2 = 4;
echo $test->p_max(); // call method

Вы также можете принять необязательные аргументы для p_max(), чтобы установить новые значения и вернуть вычисленное значение:

class test{
  public function __construct($p1, $p2){
    $this->p1 = $p1;
    $this->p2 = $p2;
  }    

  public function p_max($p1=null, $p2=null) {
    $this->p1 = $p1 ?? $this->p1;
    $this->p2 = $p2 ?? $this->p2;

    return max($this->p1, $this->p2);
  }
}

echo $test->p_max(3, 4); // call method

Также обратите внимание, что max принимает несколько аргументов, поэтому вам не нужно указывать массив.

1 голос
/ 03 мая 2019

Вы можете достичь этого, используя магический метод __get, который будет вызываться, если к свойству класса обращаются, но не определяют.На мой взгляд, это довольно странно, но работает так, как вы хотите.

<?php
class test {
    public function __construct($p1, $p2) {
        $this->p1 = $p1;
        $this->p2 = $p2;
    }

    public function __get($name) {
        if ('p_max' === $name) {
            return max(array($this->p1, $this->p2));
        }
    }
}

$test = new test(1,2);
echo $test->p_max; // Prints 2

$test->p1 = 3;
$test->p2 = 4;
echo $test->p_max; // Prints 4

При этом максимальное значение будет рассчитываться каждый раз, когда вы обращаетесь к этому свойству.

Редактировать: Поскольку метод __get будет вызываться только для свойства, которое не определено в самом классе, это не будет работать, если вы присвоите переменной значение в конструкторе или создадите его как свойство.

Edit2: Я хотел бы отметить - опять же, - что это довольно глупо делать это таким образом.Для более чистого пути воспользуйтесь ответом AbraCadaver.Вот как лично я бы это сделал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...