Re: Additions to PHP_Compat

From: Date: Wed, 26 May 2004 17:31:14 +0000
Subject: Re: Additions to PHP_Compat
References: 1  Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-29711@lists.php.net to get a copy of this message
Hmm, so it's no macro like in C? That's what I was thinking - and trying to track down :-) Otherwise upon every usage of STDIN there would be a new call to fopen(). Stefan On 26 May 2004 at 19:03, Michael Wallner wrote: > Guys, sorry - but I don't see the problem you all are seeing... ? > > Once the constant is defined (and it will only be defined once) > there is no subsequent call to fopen(). > > A constant is a constant is a constant :-) > > Regards, > mike > > Stefan Neufeind wrote: > > > On 26 May 2004 at 18:47, Lorenzo Alberton wrote: > > > > > >>On Wed, 26 May 2004 18:09:30 +0200, Michael Wallner wrote: > >> > >>>Hi Stefan Neufeind, you wrote: > >>> > >>>>>Could these be added to PHP_Compat? > >>>>> > >>>>>if (!defined('STDIN')) { > >>>>>define('STDIN', fopen('php://stdin', 'r')); > >>>>>} > >>>>>--- > >>>>>if (!defined('STDOUT')) { > >>>>>define('STDOUT', fopen('php://stdout', 'w')); > >>>>>} > >>>>>--- > >>>>>if (!defined('STDERR')) { > >>>>>define('STDERR', fopen('php://stderr', 'w')); > >>>>>} > >>>> > >>>>If you use it in a program that e.g. does multiple writes to > >>>>STDOUT, > >>>>am I wrong that this would open the file again and again for each > >>>>of the output-calls, resulting in many open files and never (until > >>>>script end) closing any of these? Or do these calls always return > >>>>the same handler to the stdout etc. (not tested)? > >>> > >>>I hope I got you right: > >>>Once STDIN is defined it won't step into the if > >>>condition any more, so php://stdin etc. is only > >>>opened once. > >> > >>I think Stefan's worries have some ground... > >>each time I *use* the constant STDIN, a fopen call > >>will be issued (is it correct?). > >>I never tried something like that, but the definition > >>above looks more like a C macro than a define... > >> > >>What about: > >>=========== > >>if (!defined('STDIN')) { > >> $_stdin = fopen('php://stdin', 'r'); > >> define('STDIN', &$_stdin); > >>} > >>=========== > >> > >>of course it is absolutely untested, but it should > >>give an idea of what Stefan was trying to say > >>and a possible solution (?). > >> > >>When I use the STDIN constant, I want THE pointer > >>back, not a NEW pointer each time... > > > > > > Just a quick test I tried (php 4.3.4-cli on Linux): > > > > <? > > define('ASTDIN', fopen('php://stdin', 'r')); > > define('ASTDOUT', fopen('php://stdout', 'w')); > > > > var_dump($a = ASTDIN); > > var_dump($b = ASTDIN); > > var_dump($a === $b); > > var_dump($c = ASTDOUT); > > ?> > > > > gives: > > > > resource(1) of type (stream) > > resource(1) of type (stream) > > bool(true) > > resource(2) of type (stream) > > > > > > So I suppose that PHP doesn't really "open" stdin, but returns the > > same stdin-resource again? Would be nice if somebody with a debugger > > could check if fopen is called twice ... in this case we could save > > some time using Mike's workaround he mentioned above. > > > > Anyway, I think such functionality for "really old php" is a good > > idea.

« previous php.pear.dev (#29711) next »