Scripts

shorttags wrapper

Een trucje om toch de shorthand open en sluit-tags te kunnen gebruiken in PHP, ook als dat niet aan staat op de server waar je het script draait. En een voorbeeldje hoe je dingen kunt doen met stream-wrappers. Er zit een functie, phtml_file, bij om gemakkelijk automatisch te kunnen beslissen of je wel of niet de wrapper nodig hebt. Voorbeeldje van gebruik: Ik gebruik hem zelf wel eens zo nu en dan, en heb er geen problemen mee ervaren, maar eigenlijk gaat het wat mis met stream_read omdat ik meer bytes kan teruggeven dan $count groot is. Ik weet niet of dat heel erg erg is. Dit is eigenlijk maar een voorbeeldje van een toepassing, en ik heb het voor mezelf geschreven omdat ik wou kijken of het kon. Als dit goed werkt, zou je in principe veel verder kunnen gaan en een hele preprocessor kunnen bouwen die van jouw code PHP code maakt, en je kan het nog transparant in je andere PHP code gebruiken ook!

phpfilestream.php
<?php

class PHPFileStream
{
	private $stream;
	
	public function stream_open($path, $mode, $options, &$opened_path)
	{
		$this->stream = fopen($this->_stripProtocol($path), $mode);
		
		return (bool) $this->stream;
	}
	
	public function stream_read($count)
	{
		// Als dit maar goed gaat, zo met $count niet kloppend.
		return str_replace('<?=', '<?php echo ', fread($this->stream, $count));
	}
	
	public function stream_write($data)
	{
		return fwrite($this->stream, $data);
	}
	
	public function stream_tell()
	{
		return ftell($this->stream);
	}
	
	public function stream_eof()
	{
		return feof($this->stream);
	}
	
	public function stream_seek($offset, $whence)
	{
		return fseek($this->stream, $offset, $whence);
	}
	
	public function stream_stat()
	{
		return fstat($this->stream);
	}
	
	public function url_stat($path, $flags)
	{
		return stat($this->_stripProtocol($path));
	}
	
	private function _stripProtocol($path)
	{
		return preg_replace('{^\w+://}', '', $path);
	}
}

stream_wrapper_register('phpfile', 'PHPFileStream');

function phtml_file($file)
{
	if (ini_get('short_open_tags'))
		return $file;
	
	return 'phpfile://' . $file;
}

Reacties

0
Nog geen reacties.