Вызов функции внутри foreach идет в другое место, чем за пределами foreach? - PullRequest
0 голосов
/ 25 сентября 2019

Ничего себе поговорим об умопомрачителе.Итак, всякий раз, когда я запускаю этот

<?php

require_once "../vendor/autoload.php";

use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;

$public_key = "PUBLIC_KEY_REDACTED";
$private_key = "PRIVATE_KEY_REDACTED";

$auth = array(
    'VAPID' => array(
        'subject' => 'https://github.com/Minishlink/web-push-php-example/',
        'publicKey' => $public_key, // don't forget that your public key also lives in app.js
        'privateKey' => $private_key, // in the real world, this would be in a secret file
    )
);

$json = json_decode(file_get_contents("php://input"));
file_put_contents("notification_subscription_info.txt", file_get_contents("php://input"));
try {
    $subscription = Subscription::create(json_decode(file_get_contents('php://input'), true));
    $notification = [
        'subscription' => Subscription::create([ // this is the structure for the working draft from october 2018 (https://www.w3.org/TR/2018/WD-push-api-20181026/)
            "endpoint" => "{$json->endpoint}",
            "keys" => [
                'p256dh' => "{$json->keys->p256dh}",
                'auth' => "{$json->keys->auth}"
            ],
        ]),
        'payload' => 'Hello!',
        ];

    $webPush = new Minishlink\WebPush\WebPush($auth);

    $webPush->sendNotification(
        $subscription,
        $notification['payload'] // optional (defaults null)
    );
    //version 1 (outside the foreach)
    $webPush->flush();

    //version 2 (inside the foreach)
    foreach($webPush->flush() as $report) { } //This can be empty
} catch (Exception $e) {
    echo $e->getMessage();
}

, я получаю очень странное поведение в своем phpstorm отладчика.Если я запускаю его с версией 1, то я не получаю push-уведомления, и он вызывает метод __destruct.

Однако, если я запускаю версию 2, я получаю нормальное поведение, и push-уведомление отправляется успешно.Это выглядит так, как будто простое пребывание внутри foreach меняет поток программы.Я понятия не имею, почему это будет, и я остаюсь, почесывая голову.Кто-нибудь знает, что происходит?

Редактировать: я ошибся насчет метода __destruct.Это вызывается, потому что это конец функции.В отладчике он пропускает вызов flush (), как будто это буквальное значение.Поэтому, если я сделаю $report = $webPush->flush();, он установит $ report, даже не вызывая функцию flush () (по крайней мере, так это выглядит).У меня даже есть точка останова в начале функции flush (), и она не срабатывает.

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