Есть ли способ, которым я могу изменить переменную класса, которая будет влиять на все экземпляры, созданные после? - PullRequest
0 голосов
/ 28 февраля 2020
class foo
{
    public $bar = 1;    
}

#foo.bar = 2; //change class variable and affect all after

$a = new foo();
$a->bar = 2;//avoid DRY

$b = new foo();
$b->bar = 2;//avoid DRY

echo $a->bar;
echo $b->bar;

Можно ли как-нибудь изменить переменную класса, которая затронет все экземпляры, созданные после?

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

Ответы [ 3 ]

2 голосов
/ 28 февраля 2020

Вам нужно сделать переменную stati c.

class foo
{
    public static $bar = 1; 
}

$a = new foo();
$a::$bar = 2;

$b = new foo();
echo $b::$bar; // 2

Вы также можете сделать Foo::$bar = 2;, чтобы установить переменную для всех экземпляров.

1 голос
/ 28 февраля 2020

Наличие свойства stati c прекрасно работает, если конструктор должен вызываться каждый раз. Однако если вы пытаетесь объединить вызовы в цепочку, вместо этого вы можете использовать clone.

class Foo
{
    public $bar = 1;

    public function bar(?int $bar = null): Foo
    {
        $this->bar = $bar ?? $this->bar;

        return $this;
    }

    public function copy(?int $bar = null): Foo
    {
        return $this->fork()->bar($bar ?? $this->bar);
    }

    public function fork(): Foo
    {
        return clone $this;
    }
}

$a = new foo();

$a2 = $a->copy();
$b = $a->copy(2);
$b2 = $a->copy();
$c = $b->copy(3);
$c2 = $b->copy();

https://3v4l.org/Fevli

Примечание. Также есть __clone() magi c метод, который позволяет вам настроить фактические клонированные свойства, которые go (например, сброс или приращение и т. Д. c).

0 голосов
/ 28 февраля 2020

Вот метод, использующий методологию static::with(), которая лучше всего подходит для подхода предварительной конфигурации DRY.

class Foo
{
    public const DEFAULT_BAR = 5;

    public $bar = FOO::DEFAULT_BAR;

    public function bar(?int $bar = null): Foo
    {
        $this->bar = $bar ?? $this->bar;

        return $this;
    }

    static public function withBar(?int $bar = null): Foo
    {
        return (new self())->bar($bar ?? Foo::DEFAULT_BAR);
    }

    public function fromBar(?int $bar = null): Foo
    {
        return (new self())->bar($bar ?? $this->bar);
    }

    public function fork(): Foo
    {
        return clone $this;
    }
}

$a = Foo::withBar();
$b = Foo::withBar(4);
$b2 = $b->fromBar();
$c = Foo::withBar();

https://3v4l.org/qI8SY

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