php / php/php-src

Properties (hooks) and inheritance

未关闭
#15,424 6 条评论 2 个 reaction 已指派 1 人 在 GitHub 查看

@iluuu1994 已经在做这个了。

开始于 2024年8月15日。

Category: Engine Feature Status: Verified
主要语言
C
星标
40.4k
派生
8.1k
平均合并
2 天 13 小时
30 天内合并 PR
96

描述

Description

Referenced RFC https://github.com/php/php-src/pull/13455

The following code:

<?php

interface ExampleInterface {} // parent
interface MutableExampleInterface extends ExampleInterface {} // child
final class Example implements MutableExampleInterface {} // impl

// parent provider
interface ExampleProviderInterface
{
    // Any type that implements ExampleInterface can be read
    public ExampleInterface $property { get; }
}

// child provider that "overrides" parent definition
interface MutableExampleProviderInterface extends ExampleProviderInterface
{
    // Any type that implements (MutableExampleInterface & ExampleInterface) can be read + write
    // We supplement the object with the set method
    public MutableExampleInterface $property { get; set; }
}

// An implementation that uses implementation
final class ExampleProvider implements MutableExampleProviderInterface
{
    public Example $property { // << implementation
        // We can return the implementation, because it implements (MutableExampleInterface & ExampleInterface)
        get => $this->property; 
        // Any instance of ExampleInterface is allowed for set, since it satisfies the covariance condition
        set (ExampleInterface $v) => $this->property = new Example($v);
    }
}

Resulted in this output:

Fatal error: Type of ExampleProvider::$property must be MutableExampleInterface (as in class MutableExampleProviderInterface)

But I expected this output instead:

*nothing*

Same code (logic) using getters and setters instead of properties: https://onlinephp.io/c/4e180

interface ExampleInterface {}
interface MutableExampleInterface extends ExampleInterface {}
final class Example implements MutableExampleInterface {}

interface ExampleProviderInterface
{
    public function getProperty(): ExampleInterface;
}

interface MutableExampleProviderInterface extends ExampleProviderInterface
{
    public function getProperty(): MutableExampleInterface;
    public function setProperty(MutableExampleInterface $value): void;
}

final class ExampleProvider implements MutableExampleProviderInterface
{
    public function getProperty(): Example {}
    public function setProperty(ExampleInterface $value): void {}
}

Ping @iluuu1994 (again) ^_^

PHP Version

PHP 8.4-beta1

Operating System

No response

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。