]> granicus.if.org Git - php/commitdiff
Don't autoload when checking property types
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 23 Oct 2019 10:19:33 +0000 (12:19 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 23 Oct 2019 10:21:30 +0000 (12:21 +0200)
Noticed while working on union types: We do not load argument and
return types during type checks, but we do load property types.

I'm normalizing the behavior towards the existing status quo (not
loading), though we may consider loading everywhere (all types,
and instanceof) in order to properly support class aliases.

Zend/tests/type_declarations/typed_properties_class_loading.phpt [new file with mode: 0644]
Zend/zend_execute.c

diff --git a/Zend/tests/type_declarations/typed_properties_class_loading.phpt b/Zend/tests/type_declarations/typed_properties_class_loading.phpt
new file mode 100644 (file)
index 0000000..0612624
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+Typed properties do not invoke the autoloader
+--FILE--
+<?php
+
+class Test {
+    public X $propX;
+    public ?Y $propY;
+}
+
+spl_autoload_register(function($class) {
+    echo "Loading $class\n";
+});
+
+$test = new Test;
+try {
+    $test->propX = new stdClass;
+} catch (TypeError $e) {
+    echo $e->getMessage(), "\n";
+}
+
+if (true) {
+    class X {}
+}
+
+$test->propX = new X;
+var_dump($test->propX);
+
+$test->propY = null;
+$r =& $test->propY;
+try {
+    $test->propY = new stdClass;
+} catch (TypeError $e) {
+    echo $e->getMessage(), "\n";
+}
+
+if (true) {
+    class Y {}
+}
+
+$r = new Y;
+var_dump($test->propY);
+
+?>
+--EXPECT--
+Typed property Test::$propX must be an instance of X, stdClass used
+object(X)#3 (0) {
+}
+Typed property Test::$propY must be an instance of Y or null, stdClass used
+object(Y)#4 (0) {
+}
index 04aa3fee6e63cf380a0f5c2f58ffdbdc7865a1ad..5407d89680876f1267e2d2516140082d8ff2168d 100644 (file)
@@ -941,7 +941,7 @@ static zend_bool zend_resolve_class_type(zend_type *type, zend_class_entry *self
                }
                ce = self_ce->parent;
        } else {
-               ce = zend_lookup_class(name);
+               ce = zend_lookup_class_ex(name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
                if (UNEXPECTED(!ce)) {
                        return 0;
                }