public Memory getRefProperty(Environment env, TraceInfo trace, IObject object, String property,
                                 PropertyCallCache callCache, int cacheIndex)
            throws Throwable {
        Memory value;

        PropertyEntity entity = callCache == null || env instanceof ConcurrentEnvironment ? null : callCache.get(env, cacheIndex);

        if (entity == null) {
            ClassEntity context = env.getLastClassOnStack();
            entity = isInstanceOf(context) ? context.properties.get(property) : properties.get(property);

            if (callCache != null) {
                callCache.put(env, cacheIndex, entity);
            }
        } else if (entity.getClazz() != object.getReflection()) {
            ClassEntity context = env.getLastClassOnStack();
            entity = isInstanceOf(context) ? context.properties.get(property) : properties.get(property);
        }

        if (entity == null) {
            PropertyEntity staticEntity = staticProperties.get(property);
            if (staticEntity != null) {
                invalidAccessToProperty(env, trace, staticEntity, staticEntity.canAccess(env));
                env.error(trace, ErrorType.E_STRICT,
                        Messages.ERR_ACCESSING_STATIC_PROPERTY_AS_NON_STATIC,
                        staticEntity.getClazz().getName(),
                        staticEntity.getName()
                );
            }
        }

        int accessFlag = entity == null ? 0 : entity.canAccess(env);

        ArrayMemory props = object.getProperties();
        if (props != null) {
            props.checkCopied();
        }

        value = props == null || accessFlag != 0 ? null : props.getByScalar(entity == null ? property : entity.specificName);

        if (accessFlag != 0) {
            invalidAccessToProperty(env, trace, entity, accessFlag);
        }

        if (value == null) {
            if (methodMagicGet != null) {
                Memory altResult = getProperty(env, trace, object, property, callCache, cacheIndex);

                if (altResult.isObject()) {
                    return altResult;
                }
            }

            value = props == null ? new ReferenceMemory() : props.refOfIndex(property);

            if (methodMagicGet != null || methodMagicSet != null) {
                env.error(trace,
                        props == null ? ErrorType.E_ERROR : ErrorType.E_NOTICE,
                        Messages.ERR_INDIRECT_MODIFICATION_OVERLOADED_PROPERTY, name, property);
            }
        }

        if (entity != null && entity.isTyped()) {
            return new ObjectPropertyMemory(env, trace, (ReferenceMemory) value, entity);
        } else {
            return value;
        }
    }
return empty list if success else list with not valid implemented methods in class

@param _interface
@return
jphp-runtime/src/php/runtime/reflection/ClassEntity.java