ovlivnuje Nette Closure / Anonymous functions?

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

zdravim, uz si nejakou tu chvilku lamu hlavu, proc mi nefunguji Closures v modelu pro Nette… kdyz ten samy kod vyplivnu vedle do nejakeho naprosto nezavisleho skriptu, vse funguje jak ma

$x = function() {
	echo time();
};
var_dump($x); // object(Closure)[1]

jakmile tento kod placnu treba do:

class Foo extends Nette\Object {
	public static function myPublicFunc() {
		$x = function() {
			echo time();
		};
		var_dump($x); // null
	}
}

dostanu misto object(Closure)[1] jen ubohy null – takze callback se vubec nevyrobi … nejak mi nedochazi, co by mohlo byt spatne, co by vlastnost jazyka mohlo ovlivnit.

  • Apache/2.2.15 (Fedora)
  • PHP 5.3.2
  • Nette 0.9.4

PS: funkci modelove tridy volam z presenteru (ve startupu) – funkce vytvari logy…

Editoval wdolek (11. 6. 2010 14:22)

Cifro
Člen | 245
+
0
-

Namiesto echo time(), daj return time().

wdolek
Člen | 331
+
0
-

Cifro: bohuzel to na to nema vubec zadny vliv… :( … a samozrejme toto je jen ukazka, ve skutecnosti by takovyhle kod nemel zadny smysl. ma closure dela vic kuriozit… a ma navratovou hodnotu (ale nefunguje to i bez ni (bez return))

Editoval wdolek (11. 6. 2010 14:32)

Cifro
Člen | 245
+
0
-

Zaujímavé. Vyskušal som s týmto kódom:

<?php
include "loader.php"; // minified
use \Nette;
class Foo extends Nette\Object {
        public static function bar() {
                $x = function() {
                        echo time();
                };
                var_dump($x); // toto vypise object(Closure)[...]
        }
}

var_dump(Foo::bar()); // a toto vypise null

a pre PHP 5.3.2 s Nette 0.9.4 to vrati

object(Closure)[1]
null

a pre PHP 5.3.2 s Nette 1.0-dev to vrati

object(Closure)[5]
null

na WinXP s Apache 2.2.14

Editoval Cifro (11. 6. 2010 15:22)

wdolek
Člen | 331
+
0
-
var_dump(Foo::bar());

vraci null zaslouzene. v tom problem nevidim (navratova hodnota fce nikde neni dana, neni tam return ~ null)… me jde spise o to, ze mi var_dump nevypise, ze jde o callback (instance Closure), ale vrati null (callback prirazuji do promenne $x, s tim, ze s tim chci nadale pracovat jako s $x(...) – nechci zbytecne vyrabet dalsi fci, ktera bude na dve pouziti)

wdolek
Člen | 331
+
0
-

ostatne je zajimave, ze null dostavam i v tomto pripade:

\Nette\Debug::dump(function() {
	return time();
});

… neco je ocividne spatne :D

Patrik Votoček
Člen | 2221
+
0
-

jenom jsem to rychle prolítnul. A řekl bych že tu došlo nedorozumění. Callback a closure jsou 2 různé věci.

EDIT:

něco evidentně špatně je protože:

\Nette\Debug::dump(function () { return time(); }); //object(Closure) (0) {}

Editoval vrtak-cz (11. 6. 2010 17:23)

wdolek
Člen | 331
+
0
-

vrtak :) jo, spatne sem pouzil slovo „callback“ … s tim samozrejme nepracuji…

ze je to spatne – to je pekne, ze sme se shodli :D ale proc?

Patrik Votoček
Člen | 2221
+
0
-

netusim… Jaka verze PHP?

Milo
Nette Core | 1283
+
0
-

Oba dva případy Foo::myPublicFunc(); i Debug::dump() u mě fungují. Vždy se vypíše closure dump.

PHP 5.3.2 na Linuxu (ruční kompilace jen ./configure a jako CGI)

Nette 1.0-dev

wdolek
Člen | 331
+
0
-

muzete mi prosim vas ozkouset toto? (skeleton s closurama)… http://storage.wdolweb.cz/…es_0.9.4.zip

mam PHP 5.3.2 … v zipu je i jednoduchy soubor s par Closures ale ze jde o objekt Closure mi to vypise jen u jedne z nich.

dale jsem zjistil, ze v presenteru (v zipu) kdyz zakomentuju prvni ConsoleDump, tak je vystup jiny nez kdyz se provadi prvni prikaz…

celkove z toho mam pocit, ze nemuzu mit v jednom skriptu vice anonymnich fci, a nekdy ani to.. :D vazne to nechapu.

closure_test.php mi vraci:

closure 1
null
closure 2
null
closure 3
object(Closure)[1]

presenter:

dummy dump
string(8) "dummy :D"

closure 1
NULL

closure 2
object(Closure) (0) {}

another dummy dump
string(8) "dummy :)"

closure 3
unknown type

Editoval wdolek (12. 6. 2010 22:08)

wdolek
Člen | 331
+
0
-

a tak uz sem na to kapnul … ani bug v PHP, natoz pak v Nette… ale eAccelerator!!!

jansfabik
Člen | 193
+
0
-

mě to funguje i se zapnutým eAcceleratorem 0.9.6, nemáš nějakou zastaralou verzi?

wdolek
Člen | 331
+
0
-

jansfabik: ne-e, mam take 0.9.6… mno nejak sem to uz pak neresil, eAccelerator jsem odinstaloval a nainstaloval APC.