Autor | Zpráva | ||
---|---|---|---|
barkel Profil |
#1 · Zasláno: 8. 10. 2019, 20:37:42
PHP od verzie 7 už má typy všakže? Ako sa teda zapíše, že funkcia požaduje array stringov (alebo alternatívnu kolekciu stringov)? Proste aby sa tam nedal dosadiť žiaden iný typ len stringy?
Myslím toto (C++): void loadEditors(const std::vector<std::string> names) { .... } v C# takto: void loadEditors(List<string> names) { .... } alebo takto: void loadEditors(string[] names) { .... } Ako to zapíšem v PHP? |
||
N71 Profil * |
#2 · Zasláno: 8. 10. 2019, 21:33:30
Zatím nijak. Definovat typ prvků pole v PHP nejde. Takže jen "array" a konkrétněji to můžeš dospecifikovat v PHPDoc metody, takže ti poskytne kontrolu aspoň IDE.
|
||
Keeehi Profil |
barkel:
Můžeš si napsat třídu, co se bude chovat jako pole, která ti vynutí určitý typ. <?php abstract class Collection implements IteratorAggregate, ArrayAccess { protected $data; public function getIterator() { return new ArrayIterator($this->data); } public function offsetSet($offset, $value) { if (is_null($offset)) { $this->data[] = $value; } else { $this->data[$offset] = $value; } } public function offsetExists($offset) { return isset($this->data[$offset]); } public function offsetUnset($offset) { unset($this->data[$offset]); } public function offsetGet($offset) { return isset($this->data[$offset]) ? $this->data[$offset] : null; } protected function validate($value, $type) { if (gettype($value) !== $type) { $traces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); $trace = $traces[count($traces) - 1]; trigger_error("Uncaught TypeError: Argument 2 passed to ".$trace['class'].$trace['type'].$trace['function']."() must be of the type ".$type.", ".gettype($value)." given.", E_USER_ERROR); } } } class array˂string˃ extends Collection { public function __construct(string ...$data) { $this->data = $data; } public function offsetSet($offset, $value) { $this->validate($value, "string"); parent::offsetSet($offset, $value); } public function offsetGet($offset): string { return parent::offsetGet($offset); } } $o = new array˂string˃("Foo", "Bar"); Celé kouzlo závorek <> spočívá v tom, že to nejsou závorky <> ale úplně jiné unicode znaky, které však vypadají jako závorky. Máš na výběr dokonce z několika U+02C2 ˂ Modifier Letter Left Arrowhead U+02C3 ˃ Modifier Letter Right Arrowhead U+2039 ‹ Single left-pointing angle quotation mark U+203A › Single right-pointing angle quotation mark U+1438 ᐸ Canadian syllabics pa U+1433 ᐳ Canadian syllabics po Btw. není to můj nápad, někde jsem to před lety viděl ale dnes už originál nedohledám. Osobně bych to ale nepoužíval. V php 8.0 by měly být union types (int|string) což sice nemá s tím co chceš nic společného, ale ukazuje to, že typehinty se v PHP stále rozšiřují. Tak se možná jednou dočkáš i ty. |
||
blaaablaaa Profil |
barkel:
Zatím rozumně nijak, nejlepší aktuální řešení je imho použít anotace, které ti pohlídá IDE/PHPStan/... /** * @param string[] $names */ public function loadEditors(array $names) : void { } //EDIT: koukám, že už to samé radil N71, nechám to tu kvůli příkladu |
||
N71 Profil * |
#5 · Zasláno: 9. 10. 2019, 08:54:38
Třída implementující ArrayAccess je taky možnost, byť trochu brutální. Ale používat ve jménech cokoliv jiného než základní latinku (notabene ještě něco co není ani na normální klávesnici) mi připadá úplně šílené.
|
||
Časová prodleva: 5 let
|
0