rfc:magic-methods-signature

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
rfc:magic-methods-signature [2020/04/28 16:28] – Reorganize RFC carusogabrielrfc:magic-methods-signature [2020/08/01 23:34] (current) – Move RFC to Implemented carusogabriel
Line 3: Line 3:
   * Date: 2020-04-05   * Date: 2020-04-05
   * Author: Gabriel Caruso (<carusogabriel@php.net>)   * Author: Gabriel Caruso (<carusogabriel@php.net>)
-  * Status: Under Discussion+  * Status: Implemented
   * Target Version: PHP 8.0   * Target Version: PHP 8.0
   * Implementation: https://github.com/php/php-src/pull/4177   * Implementation: https://github.com/php/php-src/pull/4177
Line 9: Line 9:
 ===== Introduction ===== ===== Introduction =====
  
-It is currently possible to write magic methods that have signatures that don't match the signature expected, such as //%%__%%toString(): float// or //%%__%%isset(): Closure//.+It is currently possible to write magic methods that have signatures that don't match the signature expected, such as //%%__%%clone(): float// or //%%__%%isset(): Closure//.
  
 This behavior of allowing incorrect signatures was reported as [[https://bugs.php.net/69718|a bug]]. This behavior of allowing incorrect signatures was reported as [[https://bugs.php.net/69718|a bug]].
Line 21: Line 21:
 Since the introduction of types in PHP 7.0, only the checks list below were introduced to make sure that developers are using PHP's magic methods correctly: Since the introduction of types in PHP 7.0, only the checks list below were introduced to make sure that developers are using PHP's magic methods correctly:
  
-  * //%%__%%clone// return type: https://3v4l.org/Ub54p +  * //%%__%%clone()// return type: https://3v4l.org/Ub54p 
-  * //%%__%%construct// return type: https://3v4l.org/CCL11 +  * //%%__%%construct()// return type: https://3v4l.org/CCL11 
-  * //%%__%%destruct// return type: https://3v4l.org/HNkgW +  * //%%__%%destruct()// return type: https://3v4l.org/HNkgW 
-  * //%%__%%toString// return type: https://3v4l.org/jIg7b/rfc#git-php-master+  * //%%__%%toString()// return type: https://3v4l.org/jIg7b/rfc#git-php-master
  
 For PHP 8, this RFC aims to expand these checks. For PHP 8, this RFC aims to expand these checks.
Line 35: Line 35:
  
 <code php> <code php>
-/** @return mixed */ +Foo::__call(string $name, array $arguments): mixed;
-Foo::__call(string $name, array $arguments);+
  
-/** @return mixed */ +Foo::__callStatic(string $name, array $arguments): mixed;
-Foo::__callStatic(string $name, array $arguments);+
  
 Foo::__clone(): void; Foo::__clone(): void;
Line 45: Line 43:
 Foo::__debugInfo(): ?array; Foo::__debugInfo(): ?array;
  
-/** @return mixed */ +Foo::__get(string $name): mixed; 
-Foo::__get(string $name);+ 
 +Foo::__invoke(mixed $arguments): mixed;
  
 Foo::__isset(string $name): bool; Foo::__isset(string $name): bool;
Line 52: Line 51:
 Foo::__serialize(): array; Foo::__serialize(): array;
  
-/** @param mixed $value */ +Foo::__set(string $name, mixed $value): void;
-Foo::__set(string $name, $value): void;+
  
 Foo::__set_state(array $properties): object; Foo::__set_state(array $properties): object;
Line 66: Line 64:
 </code> </code>
  
-**Note:** The //%%__%%construct// and //%%__%%destruct// methods won'be changed. They won't allow //void// as a return type given the fact that (almost) all languages, including PHP, have the concept of Constructors and Destructors "returning" something after their execution. +**Note:** The //%%__%%construct()// and //%%__%%destruct()// methods won'suffer any changes. They won't allow //void// as a return type given the fact that (almost) all languages, including PHP, don'have the concept of Constructors and Destructors "returning" something after their execution. 
      
 ===== Backward Incompatible Changes ===== ===== Backward Incompatible Changes =====
Line 82: Line 80:
 Scraping the top 1000 Composer packages (using Nikita's [[https://gist.github.com/nikic/a2bfa3e2f604f66115c3e4b8963a6c72|script]]), [[https://gist.github.com/carusogabriel/e0b36e7cd9e6846e04f79008cb7e35d6|the results]] show only 7 occurrences of not matching signatures.  Scraping the top 1000 Composer packages (using Nikita's [[https://gist.github.com/nikic/a2bfa3e2f604f66115c3e4b8963a6c72|script]]), [[https://gist.github.com/carusogabriel/e0b36e7cd9e6846e04f79008cb7e35d6|the results]] show only 7 occurrences of not matching signatures. 
  
-Luckily, none of them is a problem as //%%__%%call//, //%%__%%callStatic// and //%%__%%get// do not have checks at this time. +Luckily, none of them is a problem as //%%__%%call()//, //%%__%%callStatic()// and //%%__%%get()// do not have checks at this time. 
  
 Even with a //mixed// RFC that wouldn't be a problem, as [[https://github.com/php/php-src/blob/ad7e93a023a9/Zend/tests/type_declarations/mixed/inheritance/mixed_return_inheritance_success2.phpt|a specific type can override it]], by the Liskov Substitution Principle. Even with a //mixed// RFC that wouldn't be a problem, as [[https://github.com/php/php-src/blob/ad7e93a023a9/Zend/tests/type_declarations/mixed/inheritance/mixed_return_inheritance_success2.phpt|a specific type can override it]], by the Liskov Substitution Principle.
Line 90: Line 88:
 This RFC only aims to add checks for the methods' signatures but as a Future Scope, a runtime check of what is been returning in the methods could be added, same as This RFC only aims to add checks for the methods' signatures but as a Future Scope, a runtime check of what is been returning in the methods could be added, same as
  
-  * //%%__%%serialize//: https://3v4l.org/HLiTj +  * //%%__%%serialize()//: https://3v4l.org/HLiTj 
-  * //%%__%%toString//: https://3v4l.org/Dbe6G +  * //%%__%%toString()//: https://3v4l.org/Dbe6G 
-  * //%%__%%debugInfo//: https://3v4l.org/0EEPh +  * //%%__%%debugInfo()//: https://3v4l.org/0EEPh 
-  * //%%__%%sleep//: https://3v4l.org/dH96A+  * //%%__%%sleep()//: https://3v4l.org/dH96A 
 + 
 +===== Voting =====
  
-===== Proposed Voting Choices =====+Voting started on 2020-05-29 at 18h (CEST) and ends on 2020-06-19 at 18h (CEST).
  
-Yes/No.+<doodle title="Ensure correct signatures of magic methods" auth="carusogabriel" voteType="single" closed="true"> 
 +   Yes 
 +   No 
 +</doodle>
  
 ===== External resources ===== ===== External resources =====
rfc/magic-methods-signature.1588091328.txt.gz · Last modified: 2020/04/28 16:28 by carusogabriel