手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2009年07月31日的文章

List of Supported Protocols/Wrappers

以下部分内容来自手册,比如这个列表:

对于这个列表,熟悉的人可能很熟悉,不熟悉的人,应该不太会关注,以前我也一样。
直到,我看到zend framework,发现在zend_view里,他就模拟了一个协议:zend.view://,为的就是将那些模版中采用短标签(<? =$a ?>)的代码改为长标签(<?php echo $a ; ?>)。

其实我再次看它,也只是一个顺便。yhustc想尝试把以下内容输出:

PHP代码
  1. <?php  
  2. $str = '今天是:<?php echo date("Y-m-d"); ?>';    
  3. file_put_contents('test.php'$str );  
  4. include'test.php' );   

输出结果是类似:今天是2009-01-01这样的结果,但事实上的输出却还是

XML/HTML代码
  1. 今天是:<?php echo date("Y-m-d"); ?>  

yhustc进行了尝试,如果这个内容写入文件,然后通过include,就可以显示正确的结果:

PHP代码
  1. <?php    
  2. $str = '今天是:<?php echo date("Y-m-d"); ?>';      
  3. file_put_contents('test.php'$str );    
  4. include'test.php' );  

但是yhustc不想要这个多出来的IO,因为写入文件后,你总还得删除吧?如果类似的东西太多,IO就太恐怖了。

于是我根据zend.view://这个协议,想起了PHP自带的。并使用Data的协议或者称Wrappers来解决了这个问题:

PHP代码
  1. $str = "函数使用 今天的日期: <?php echo date('Y-m-d');?>";  
  2. $strBase64 = base64_encode$str );  
  3. include("data://text/plain;base64,{$strBase64}") ;  

关于这个data的wrappers请查看上面的列表,我也就不详细说了,它是符合RRC2397的标准的。
事实上这个Data也是从5.2.0才开始支持的,而且更重要的是上面的第三行代码:

PHP代码
  1. include("data://text/plain;base64,{$strBase64}") ;   

这句话还需要另外一样东西支持:allow_url_include,而这个又需要allow_url_open的支持。(需要改php.ini)
有了这个支持,你以后看到这样的代码:

PHP代码
  1. <?php  
  2. include("http://localhost/needrequire.php");  
  3. echo 'test';  

就不需要更感到惊讶和愤怒了。毕竟,它事实上是支持的,只要这个needrequire.php是返回正确的PHP代码,比如test.php的内容为:

PHP代码
  1. <?php  
  2. echo'<?php class a{ function a(){echo "test";}}?>' );      
  3. ?>  

然后:

PHP代码
  1. <?php  
  2. include'http://localhost/test_echo.php' );  
  3. $a = new a();  

还是会正常的输出test的。