Bug #77287 [Com]: Fatal error: Uncaught TypeError

From: Date: Wed, 26 Dec 2018 00:49:14 +0000
Subject: Bug #77287 [Com]: Fatal error: Uncaught TypeError
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-218615@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=77287&edit=1

 ID:                 77287
 Comment by:         pirogen at protonmail dot com
 Reported by:        someone dot is dot alive at gmail dot com
 Summary:            Fatal error: Uncaught TypeError
 Status:             Open
 Type:               Bug
 Package:            opcache
 Operating System:   Windows
 PHP Version:        7.3.0
 Block user comment: N
 Private report:     N

 New Comment:

I've encountered this as well after upgrading from 7.2 to 7.3 on Debian Testing. Unfortunately,
I can't seem to reproduce it in a minimal fashion; it only occurs in a project with rather
large graph of inter-dependent objects.

The bug manifests itself with class methods that use constants (can be a class constant, built-in
constant or user-defined global constant) as default parameter values, i.e.:

public function someMethod($some_param=SOME_CONSTANT) {}

When someMethod is called with no arguments, $some_param *sometimes* (more often than not, but not
always) receives a value that var_dump() identifies as NFC. Which, if passed down to a function or
method that expects a specific type, throws a "[function] expects parameter [num] to be [type],
unknown given" error OP mentions.


Previous Comments:
------------------------------------------------------------------------
[2018-12-17 00:40:12] andrew at fw dot net dot nz

I encountered the same error after upgrading php-fpm from 7.2 to 7.3 on Ubuntu 18.04. An argument
with a default parameter threw a type error "unknown given" when the callee did not
provide the argument at all.
I ran opcache_reset() which resolved it.

A google search found another mention of the same error in 7.3 here:
https://github.com/nextcloud/server/issues/11868

------------------------------------------------------------------------
[2018-12-12 10:59:04] nikic@php.net

Can't repro on Ubuntu, possibly Windows only.

The resolved default value for the 2nd arg will be stored in the RT cache, so maybe there is an
invalidation problem.

------------------------------------------------------------------------
[2018-12-12 10:26:01] someone dot is dot alive at gmail dot com

I think i found a problem - when opcache is enabled i get the error. Usually happens when i edit
file (e.g. (un)comment TestConst::STEP_2)

This is the shortest code to reproduce:
- no exception at all (e.g. for first 10 requests or it may throw error on first attempt)
- Argument 2 passed to PHPDemo\Utils::testInput() must be of the type int, unknown given
- Argument 2 passed to PHPDemo\Utils::testInput() must be of the type int, object given
- Argument 2 passed to PHPDemo\Utils::testInput() must be of the type int, bool given

<?php
namespace PHPDemo;

class TestConst {
    const STEP_1 = 1;
    const STEP_2 = 2;
}

class Utils {
    public static function testInput(string $name, int $step = TestConst::STEP_1) { }
}

Utils::testInput('abc 1');


------
I deleted all cached files, restarted server
OPCache log (opcache.log_verbosity_level=4)
Wed Dec 12 11:15:22 2018 (33644): Debug Restart Scheduled! Reason: user
Wed Dec 12 11:15:22 2018 (33644): Debug Restarting!
Wed Dec 12 11:17:53 2018 (33644): Message Cached script 'D:\www\demo.php'
Wed Dec 12 11:15:45 2018 (33644): Message Added key 'D:/www/demo.php'
Wed Dec 12 11:18:44 2018 (33644): Message Cached script 'D:\www\demo.php'
Wed Dec 12 11:18:44 2018 (33644): Message Added key 'D:/www/demo.php'

------------------------------------------------------------------------
[2018-12-12 09:11:07] peehaa@php.net

Can you limit it to the actual problem code?

There are a lot of random (and seemingly unrelated) things going on in the code. If all that code is
actually needed to reproduce please say so. If need please provide the minimal code to reproduce the
problem.

------------------------------------------------------------------------
[2018-12-12 08:58:46] someone dot is dot alive at gmail dot com

Test script (below) is copied from zip file.

<?php
namespace PHPDemo;

class TestConst {
    const STEP_1 = 1;
    const STEP_2 = 2;

    public static $persistent = true;
    private static $instance = null;
    private $currentStep = self::STEP_1;

    private function __construct() { }

    public function wasPreviousStepCompleted(int $currentStep) : bool {
        return $this->currentStep >= $currentStep;
    }

    public static function &instance() {
        if (session_id() == '') {
            session_start();
        }
        if (is_null(self::$instance)) {
            self::$instance = new TestConst();
        }
        if (self::$persistent) {
            $_SESSION['TestConst'] = self::$instance;
        } else {
            unset($_SESSION['TestConst']);
        }
        return self::$instance;
    }

    public static function destroyInstance() {
        self::$instance = null;
    }

    public function __wakeup() {
        self::$instance =& $this;
    }
}

class Utils {
    public static function testInput(string $name, int $step = TestConst::STEP_1) {
        var_dump(func_get_args());
        if (empty($name)) {
            return;
        }

        echo 'Hello world! ' . $name . ' > ' . $step . '<br
/>';

        $test = TestConst::instance();
        if ($test->wasPreviousStepCompleted($step)) {
            echo 'yes';
        } else {
            echo 'no';
        }
        echo '<br />';
    }
}

TestConst::instance();

Utils::testInput('abc 1');
Utils::testInput('abc 2', TestConst::STEP_2);
Utils::testInput('abc 3');

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=77287


--
Edit this bug report at https://bugs.php.net/bug.php?id=77287&edit=1


Thread (18 messages)

« previous php.bugs (#218615) next »