protected Memory typedDefaultValue(Environment env, Memory defaultValue) {
        if (typeChecker != null && defaultValue != null && !defaultValue.isUninitialized()) {
            if (!checkTypeHinting(env, defaultValue)) {
                ModuleEntity module = env.getModuleManager().findModule(trace);
                Memory memory = applyTypeHinting(env, defaultValue, module != null && module.isStrictTypes());

                if (memory == null) {
                    String mustBe = typeChecker.getSignature();

                    if (!nullable && defaultValue.isNull()) {
                        env.error(trace,
                                "Default value for property of type %s may not be null. Use the nullable type ?%s to allow null default value",
                                mustBe, mustBe
                        );
                    } else {
                        env.error(trace,
                                "Cannot use %s as default value for property %s::$%s of type %s",
                                InvokeArgumentHelper.getGiven(defaultValue, true), getClazz().getName(), getName(), mustBe
                        );
                    }
                }

                return memory;
            }
        }

        return defaultValue;
    }
0 - success
1 - invalid protected
2 - invalid private
@param env
@return
jphp-runtime/src/php/runtime/reflection/PropertyEntity.java