We should only disable early binding during the opcache_compile_file()
calls, not inside the preloading script or anything it includes.
The right condition to check for is whether we compile the file
without execution, as declaring classes is "execution".
if (toplevel
/* We currently don't early-bind classes that implement interfaces or use traits */
&& !ce->num_interfaces && !ce->num_traits
- && !(CG(compiler_options) & ZEND_COMPILE_PRELOAD)) {
+ && !(CG(compiler_options) & ZEND_COMPILE_WITHOUT_EXECUTION)) {
if (extends_ast) {
zend_class_entry *parent_ce = zend_lookup_class_ex(
ce->parent_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
--- /dev/null
+<?php
+var_dump(new X);
+class X {}
--- /dev/null
+--TEST--
+Early binding should work fine inside the preload script
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.preload={PWD}/preload_early_binding.inc
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
+?>
+--FILE--
+OK
+--EXPECT--
+object(X)#1 (0) {
+}
+OK