$obj->onChange = … bez hranatých závorek

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8227
+
0
-

Protože na událost může reagovat více handlerů, přidávají se ve formě pole:

$obj->onChange[] = 'eventHandler';

I když budu chtít přidat jen jeden handler (a zároveň budu mít jistotu, že skutečně bude přidán jen jeden handler, tj. k objektu nebude mít nikdo jiný přístup), nelze hranaté závorky vynechat. Důvod je ten, že PHP callback je klasické pole a nelze rozlišit, zda array('foo', 'bar') jsou dvě funkce foo() a bar() nebo metoda foo::bar().

Nicméně při použití objektu Nette\Callback a jeho továrničky funkce callback() by to už šlo. Bylo by technicky možné povolit zápis:

$obj->onChange = callback($this, 'eventHandler');

Otázkou je, zda to udělat. Jestli to nezpůsobí začínajícím programátorům víc komplikací než užitku?

Honza Marek
Člen | 1664
+
0
-

Co udělá?

$obj->onChange = callback($this, 'eventHandler');
$obj->onChange[] = "jinaFunkce";

Půjde stále použít nativní php callback nebo budu muset začít používat tyhle nette callbacky?

Ondřej Mirtes
Člen | 1536
+
0
-

A co zavést ještě syntaxi $this->callback('mojeMetoda'); ? :)

Jinak to vypadá fajn, jen nevím, jak moc by to mátlo začátečníky. Ale když se to vysvětlí v dokumentaci, proč ne…

jasir
Člen | 746
+
0
-

Mě to připadá zbytečné a také zbytečně matoucí. Možná jsem nepochopil, co by to přineslo, ale
pokud se jedná jen ušetření napsání dvou závorek ve speciálních případech…

David Grudl
Nette Core | 8227
+
0
-

Honza Marek napsal(a):

Co udělá?

$obj->onChange = callback($this, 'eventHandler');
$obj->onChange[] = "jinaFunkce";

Tohle zcela jistě nepůjde, proto píšu o situacích, kdy prostě víš že existuje jeden callback.

David Grudl
Nette Core | 8227
+
0
-

Ondřej Mirtes napsal(a):

A co zavést ještě syntaxi $this->callback('mojeMetoda'); ? :)

Delší a nesrozumitelné.

nAS
Člen | 277
+
0
-

jasir napsal(a):

Mě to připadá zbytečné a také zbytečně matoucí.

+1

Jan Tvrdík
Nette guru | 2595
+
0
-

jasir napsal(a): Mě to připadá zbytečné

+1

Ondřej Brejla
Člen | 746
+
0
-

nAS napsal(a):

+1

+1 :-)

v6ak
Člen | 206
+
0
-

Přijde mi to jako matoucí. Když můžu napsat $foo->onBar = callback(…), proč bych nemohl napsat také $foo->onBar = array(…), že? (Já vím proč, ale už vidím ty nováčky…)

Spíš bych udělal kontrolu správnosti callbacku při přiřazení, jak jsem tu už dřív psal, aby k podobnému problému (vynechání []) nedocházelo.

Patrik Votoček
Člen | 2221
+
0
-

David Grudl napsal(a):

Ondřej Mirtes napsal(a):

A co zavést ještě syntaxi $this->callback('mojeMetoda'); ? :)

Delší a nesrozumitelné.

$this->onChange('mojeMetoda');
//resp.
$this->onChangeCallback('mojeMetoda');

jinak +1

Petr Motejlek
Člen | 293
+
0
-

Nevidím smysl ani v jedné z těch věcí ;).

PetrP
Člen | 587
+
0
-

vrtak-cz napsal(a):

$this->onChange('mojeMetoda');
//resp.
$this->onChangeCallback('mojeMetoda');

Takhle se ale pak ta událost vyvolává ;]

David Grudl
Nette Core | 8227
+
0
-

Ok, ok, téma zavírám. Potřeboval jsem nasbírat materiál, až někdo přijde s otázkou, proč nefunguje onChange = … :-))