Autor Zpráva
joe
Profil
Zdravím,

nevíte někdo jestli jde zjistit typ parametru v mětodě?
public function test(string $name) {}


Chtěl bych zjistit, že parametr $name je typu string, jde to? Něpřišel jsem na to, tak jestli to PHP vůbec umí?
Radim24
Profil
Já sice s tímhle nepracuju ale asi bych zkusil is_str(func_get_arg(0));
Nox
Profil
Buď to nechápu, anebo... http://cz.php.net/manual/en/function.is-string.php ?
Jde o známý argument, takže by šlo
is_string($name)
joe
Profil
Potřeboval bych to mimo tu metodu, takže nějak přes Reflection. Ale tam jsem o typu parametrů nic nenašel.
Mastodont
Profil
joe
V hlavičce metody nemůžeš určit, že parametr má být typu string, takže to nejde ani zjistit.
fuckin
Profil
joe
muzes to udelat az v te metode nebo jeste pred aktivovanim metody, v hlavicce to nelze.

Resil bych to nejak takto
$name = is_string($name) ? $name : null;

If (isset($name)) {
 $this->test($name)
}
else
{ die(" parametr neni string ! "); } 
joe
Profil
Mastodont
Proč bych to nemohl určit? Byl to zrovna špatný příklad, ale můžu si zvolit v mětodě, jaký typ má být paramter. V tom případě co jsem napsal, bych tam mohl dosadit jen instanci třídy string.

fuckin
Dal jsem špatný příklad. Nejde mi konkrétně o string. Může tam být jakýkoli typ a já jen chci zjistit jakou instanci které třídy tam mohu použít.
Mastodont
Profil
joe
Můžeš tam zadat jen Array nebo třídu, ne hodnotové typy.
joe
Profil
Mastodont
Proč myslíš? Možná v nějaké starší verzi PHP a nebo si nerozumíme :)

<?php

function test (A $a) {
	echo $a->var;
}

class A {
	public $var;
	public function __construct() {
		$this->var = "promenna";
	}
}


$a = new A();

test($a);


EDIT: A teď bych právě chtěl vědět, jakého typu musí být proměnná $a (ten parametr ve funkci test() - tedy konkrétně tady, že musí být instancí třídy A)
fuckin
Profil
var_dump($a);
Mastodont
Profil
joe
Ty nerozumíš, A je třída. Zkus si tam dát int ..
joe
Profil
fuckin
Nejsem věštec :-)

Mastodont
Já rozumim moc dobře, proto se taky ptám. To je jasné, že to nepůjde, když tam dám int, string, array nebo cokoli jiného kromě instance třídy A.

Já jen chci zjistit, jakého typu má být ten parametr. Chápeš? :-) Nejsem si jistý, tak trochu jinak. Jsou dány třeba následující funkce:
function testA(A $a) {...}
function testAB(A $a, B $b) {...}
function testABC(A $a, B $b, C $c) {...}

Tyhle funkce znám a zjistim si, kolik parametrů potřebuji, abych je mohl zavolat. Ale k tomu počtu parametrů chci taky ještě zjistit jakého typu jsou ty vstupní parametry. Takže chci zjistit přesně tohle:

testA() - jeden vstupní parametr, který musí být instancí třídy A
testAB() - dva vstupní parametry, první instancí třídy A a druhý instancí třídy B
testABC() - tři vstupní parametry, první instancí třídy A, druhý instancí třídy B a třetí instancní třídy C

A to všechno chci zjistit mimo tyhle funkce. Snad jsem to už jasně vysvětlil...
fuckin
Profil
je mozne nakam ty udaje ulozit a pak je pri zpracovani nacist abys poznal jak s kterou metodou pracovat?
joe
Profil
fuckin
To klidně můžu, ale tak jsem to řešit právě nechtěl... To bych musel ke každý metodě někde ukládat další informace, v nejhorším případě to tak asi udělám.
Mastodont
Profil
joe
No tak když je to jasné, proč v první otázce uvádíš zrovna "string"??
Co potřebuješ, je třída ReflectionParameter, ta vrací typ v GetName.
joe
Profil
Mastodont
proč v první otázce uvádíš zrovna "string"??
A není to jedno? Třídu string si můžu napsat.

ta vrací typ v GetName.
Nevrací, vrací jen název parametru a ten je string < pokud to je u tebe jinak, pak mi prosím napiš jak?
Mastodont
Profil
Sorry, getClass. Vyzkoušej si Example #3 ze http://cz2.php.net/manual/en/language.oop5.reflection.php
Lamicz
Profil
joe: Lidi, nedejte s tím OOP psí kusy, takový věci nejsou normálně vůbec potřeba. Tohle mi smrdí špatným OOP návrhem.
joe
Profil
Mastodont
Jéé, díky. Tak tuhme metodu jsem nějak omylem vyřadil, ani nevím proč. Přesně to jsem potřeboval, díky.

Lamicz
I v případě, že si takové metody může psát sám programátor a chci mu jen usnadnit práci tim, že v každé metodě nemusí parametr přetypovávat? ;-) Já stojím za jednoduchostí, nemám rád obrovské OOP.

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: