Properties (hooks) and inheritance
Offen
@iluuu1994 arbeitet bereits daran.
Seit 15.8.2024.
Category: Engine
Feature
Status: Verified
- Vorherrschende Sprache
- C
- Sterne
- 40.4k
- Forks
- 8.1k
- Ø Merge
- 2 T. 13 Std.
- Gemergte PRs (30 T.)
- 96
Beschreibung
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
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Bewertung
Dieses Issue wurde noch nicht bewertet.