Size: a a a

2020 October 15

В

Виктор in Yii Framework 3
@BoShurik, напиши лучше свое предложение в PR: там больше вероятность, что его увидят и обсудят. Лично мне не нравится идея кидать исключение, но я могу быть и не прав.
источник

AB

Alexander Borisov in Yii Framework 3
Виктор
согласно документации, id может быть переиспользован, если объект, которому он назначен, уничтожен
class Foo
{
   public function __construct()
   {
       echo 'construct '. spl_object_id($this) . \PHP_EOL;
   }

   public function __destruct()
   {
       echo 'destruct '. spl_object_id($this) . \PHP_EOL;
   }
}

$object = new Foo();
echo 'begin '. spl_object_id($object) . \PHP_EOL;

$object = new Foo();
echo 'end '. spl_object_id($object) . \PHP_EOL;


c
onstruct 1
begin 1
construct 2
destruct 1
end 2
destruct 2
источник

AB

Alexander Borisov in Yii Framework 3
новый объект создается до уничтожения предыдущего
источник

В

Виктор in Yii Framework 3
Alexander Borisov
новый объект создается до уничтожения предыдущего
Php это гарантирует для всех версий (7.4+)?
источник

В

Виктор in Yii Framework 3
тьфу, это ж просто порядок операторов)
источник

В

Виктор in Yii Framework 3
глупость сказал
источник

AB

Alexander Borisov in Yii Framework 3
а вообще ты прав
источник

AB

Alexander Borisov in Yii Framework 3
$object = new Foo();
echo 'begin '. spl_object_id($object) . \PHP_EOL;
$object = null;
$object = new Foo();
echo 'end '. spl_object_id($object) . \PHP_EOL;

co
nstruct 1
begin 1
destruct 1
construct 1
end 1
destruct 1
источник

В

Виктор in Yii Framework 3
public static function listener(&$event) {
unset($event);
$event = new AnotherEvent();
}
источник

В

Виктор in Yii Framework 3
Alexander Borisov
$object = new Foo();
echo 'begin '. spl_object_id($object) . \PHP_EOL;
$object = null;
$object = new Foo();
echo 'end '. spl_object_id($object) . \PHP_EOL;

co
nstruct 1
begin 1
destruct 1
construct 1
end 1
destruct 1
Об одном и том же сейчас подумали)
источник

AB

Alexander Borisov in Yii Framework 3
С другой стороны:
источник

AB

Alexander Borisov in Yii Framework 3
function evil(&$event) {
   $event = null;
   $event = new Foo();
}

function dispatch($event) {
   evil($event);

   return $event;
}

$object = new Foo();
echo 'begin '. spl_object_id($object) . \PHP_EOL;
$result = dispatch($object);
echo 'end '. spl_object_id($result) . \PHP_EOL;

co
nstruct 1
begin 1
construct 2
end 2
destruct 2
destruct 1
источник

AB

Alexander Borisov in Yii Framework 3
Все гораздо проще:
function evil(&$event) {
   $event = null;
   $event = new Foo();
}

function dispatch($event) {
   $save = $event;
   evil($event);
   echo 'saved '. spl_object_id($save) . \PHP_EOL;

   return $event;
}

$object = new Foo();
echo 'begin '. spl_object_id($object) . \PHP_EOL;
$result = dispatch($object);
echo 'end '. spl_object_id($result) . \PHP_EOL;

co
nstruct 1
begin 1
construct 2
saved 1
end 2
destruct 2
destruct 1
источник

AB

Alexander Borisov in Yii Framework 3
public function dispatch(object $event): object
{
   $savedEvent = $event;
   foreach ($this->listenerProvider->getListenersForEvent($event) as $listener) {
       $listener($event);
   }

   if ($savedEvent !== $event) {
       throw new \LogicException();
   }

   return $event;
}
источник

А

Алексей R in Yii Framework 3
какую задачу вы решаете?
источник

А

Алексей R in Yii Framework 3
запретить слушателю перезаписывать событие, если слшатель получил его по ссылке?
источник

В

Виктор in Yii Framework 3
Алексей R
запретить слушателю перезаписывать событие, если слшатель получил его по ссылке?
да
источник

А

Алексей R in Yii Framework 3
так изи же :D
источник

В

Виктор in Yii Framework 3
Alexander Borisov
public function dispatch(object $event): object
{
   $savedEvent = $event;
   foreach ($this->listenerProvider->getListenersForEvent($event) as $listener) {
       $listener($event);
   }

   if ($savedEvent !== $event) {
       throw new \LogicException();
   }

   return $event;
}
вот один вариант
источник

В

Виктор in Yii Framework 3
источник