otypovanie argumentov v hlavicke metody/funkcie

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
whitedeath
Člen | 25
+
0
-

Nette Framework 2.0.1 (revision 94abcaa released on 2012–02–29)
PHP 5.3.9
Netbeans IDE 7.1

Nazdar,

neviem, ci tato otazka vobec patri do Nette fora, alebo do nejakeho vseobecnejsieho, ale zaujima ma, ci je mozne nejakym sposobom force-nut, aby som to tela funckie musel zadavat ako argument presne nejaky typ, konkretnejsie:

<?php
abstract function foo(array $pole, string $retazec, integer $cislo, char $znak); // atd, atd...
?>

viem ze array funguje… zaujima ma ci toto Nette nejako riesi, alebo si tieto veci musim osetrit dodatocne v tele metody/funkcie napriklad pomocou is_numeric() atd.

zvykol som to ajriesit takto:

<?php
abstract function foo($pole = array(), $retazec = "", $cislo = 0); // atd, atd...
?>

alebo potom vovnutri, ale pohodlnejsie by to bolo, keby sa to dalo osetrit uz pri deklaracii nie?

Dakujem!

Ascaria
Člen | 187
+
0
-

Toto není na úrovni Nette, ale PHP, vynutit si typ můžeš u array a libovolného objektu, ale u základních typů ne a vývojaři PHP to prý nebudou měnit.

Pokud chceš v metodě string, lze jen

<?php

public function a($a)
    {
    if(!is_string($a))
        throw new \Nette\InvalidStateException('String expected');
    }

?>

Pokud nechceš psát do každé metody to samé, musiš to číslo předávat jako object

<?php

class Integer extends \Nette\Object
    {
    private $int;

    public function __construct($int)
        {
        $this->setValue($int);
        }

    public function setValue($int)
        {
        if(!is_int($int))
            throw new \Nette\InvalidStateException('Integer expected');
        $this->int = $int;
        }

    public function getValue()
        {
        return $this->int;
        }

    /** __toString kvůli tomu, abys mohl používat $x = $Int + 1 a ne jen $x = $Int->value + 1; číslo se přetypuje na string a pak díky sčítání zpět na int */
    public function __toString()
        {
        return (string)$this->int;
        }
    }

public function NejakaMetodaSCislem(Integer $int)
    {
    return $int->value + 1;
    }

?>

Přemýšlel jsem, že začnu používat podobné třídy pro striktní dodržování typů, ale pak jsem od toho upustil, protože kromě toho že to vypadá moc blbě, tak je to moc blbý.

Editoval Ascaria (21. 3. 2012 20:12)

whitedeath
Člen | 25
+
0
-

Nuz taku nejaku triedu som si predstavoval, kedze inac sa to neda, ale myslim, ze to budem kontrolovat vnutri v metode a dovidenia, lebo takto by to nebolo tak celkom normalne ;)

Vdaka!

Aurielle
Člen | 1281
+
0
-

Máme validátory.

Jan Tvrdík
Nette guru | 2595
+
0
-

whitedeath wrote: neviem, ci tato otazka vobec patri do Nette fora, alebo do nejakeho vseobecnejsieho

To já vím! Sem to nepatří. Zamykám a vyhazuji.