Autor Zpráva
barkel
Profil
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 *
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 *
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é.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0