Ousland
侠客
侠客
  • UID67
  • 粉丝10
  • 关注0
  • 发帖数38
  • 社区居民
  • 阅读:1999
  • 回复:0

第八周作业 2014-09-14 崔景宇

楼主#
更多 发布于:2014-09-04 23:32
php高级特性作业

1. 将课堂上讲过的 5.php 中的各个类提取到单独的文件中,为每个类添加合适的命名空间并放到合适的目录中,再通过 autoload 将各部分组合起来确保代码正常运行。
/*
自动加载,如果我没理解错的话,其实是利用命名空间作为路径信息;
 
假设 我定义了一个mode类;
 
class mode {
     
 
}
 
它的命名空间是
namespace demo;
 
如果我在其他文件下,并没有事先include这个类文件.
 
那么 当我
new \demo\mode;
 
类没找到, 就会触发事先定义好的方法;
spl_autoload_register( function( $className ) {
     
});
 
此时 形参$classname的值 便会是 \demo\mode
 
那么如果利用这个特性.
定义一个规则:
命名空间 = 文件目录;
类名 = 文件名;
命名空间的根 =  项目根目录;
 
那么mode类所在的文件目录便是 /根目录/demo/
文件名是 mode+自定义的后缀 如 class.php;
 
那么完整的路径便是 /根目录/demo/mode.class.php;
 
spl_autoload_register( function( $className ) {
    # 将命名空间的\变为文件目录的/;
    require (  __ROOT__.'/'.str_replace( '\\', '/', $className ).'.class.php' );
});
 
自动加载完成;
 
所以,只要根据一个规则,无论怎么建立目录和文件,只要能和规则对应上,即可实现自动加载;
 
*/



2.为 FileDb 类添加代码,实现可通过foreach对其按文本中的行进行遍历的功能。

这里可以直接利用php新版本的 生成器.yield 即可;

php运行机制与选项作业

封装一个myfopen函数, 实现调用fopen ,并可以设置超时时间。
/**
 * fopen打开一个远程路径时,设置超时时间;
 */
function myfopen( $url, $timeout = 30 ) {
 
    /**
     * 手册上说, 5.0以后 fopen和file_get_content支持上下文操作;
     * 这样的话,通过这里应该就可以直接使用fopen/file_get_content进行post;
     * 不知道我有没有理解错;
     */
    $context = stream_context_create( array(
        'http' => array(
            'timeout' => $timeout
        )
    ) );
 
    $handle = @fopen( $url, 'rb', false, $context );
     
    if ( $handle ) {
        //设置是否是阻塞操作;
        stream_set_blocking( $handle, false ); 
        //设置超时, 这里设置的超时,应该是对应fread,fwrite之类的操作吧?
        stream_set_timeout( $handle, $timeout );
        /*
         * 这里可以获取到状态,可以通过这里获取http协议; 也可以获取超时状态等;
         */
        #$status = stream_get_meta_data( $handle );
        return $handle;
    }
     
    return false ;
}
 
$startTime = time();
$res = myfopen( 'http://www.google.com', 32 );
$endTime = time();
var_dump( $res );
var_dump( $endTime - $startTime );
喜欢0

返回顶部