PHP code example of joinleft / myframe

1. Go to this page and download the library: Download joinleft/myframe library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

joinleft / myframe example snippets





    $_SERVER;                			//超全局变量用来存储所有http协议发送的信息
    $_SERVER['PHP_SELF']; 				//当前正在执行脚本的文件名,与 document root相关。 
    $_SERVER['argv']; 					//传递给该脚本的参数。 
    $_SERVER['argc']; 					//包含传递给程序的命令行参数的个数(如果运行在命令行模式)。 
    $_SERVER['GATEWAY_INTERFACE']; 		//服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。 
    $_SERVER['SERVER_NAME']; 			//当前运行脚本所在服务器主机的名称。 
    $_SERVER['SERVER_SOFTWARE']; 		//服务器标识的字串,在响应请求时的头部中给出。 
    $_SERVER['SERVER_PROTOCOL']; 		//请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。 
    $_SERVER['REQUEST_METHOD']; 		//访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。 
    $_SERVER['QUERY_STRING']; 			//查询(query)的字符串。 
    $_SERVER['DOCUMENT_ROOT']; 			//当前运行脚本所在的文档根目录。在服务器配置文件中定义。 
    $_SERVER['HTTP_ACCEPT']; 			//当前请求的 Accept: 头部的内容。 
	$_SERVER['HTTP_ACCEPT_CHARSET']; 	//当前请求的 Accept-Charset: 头部的内容。例如:“iso-8859-1,*,utf-8”。 
    $_SERVER['HTTP_ACCEPT_ENCODING'];	//当前请求的 Accept-Encoding: 头部的内容。例如:“gzip”。 
    $_SERVER['HTTP_ACCEPT_LANGUAGE'];	//当前请求的 Accept-Language: 头部的内容。例如:“en”。 
    $_SERVER['HTTP_CONNECTION'];		//当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。 
    $_SERVER['HTTP_HOST'];				//当前请求的 Host: 头部的内容。 
    $_SERVER['HTTP_REFERER'];			//链接到当前页面的前一页面的 URL 地址。 
    $_SERVER['HTTP_USER_AGENT'];		//当前请求的 User_Agent: 头部的内容。 
    $_SERVER['HTTPS'];					//如果通过https访问,则被设为一个非空的值(on),否则返回off 
    $_SERVER['REMOTE_ADDR'];			//正在浏览当前页面用户的 IP 地址。 
    $_SERVER['REMOTE_HOST'];			//正在浏览当前页面用户的主机名。 
    $_SERVER['REMOTE_PORT'];			//用户连接到服务器时所使用的端口。 
    $_SERVER['SCRIPT_FILENAME'];		//当前执行脚本的绝对路径名。 
    $_SERVER['SERVER_ADMIN'];			//管理员信息 
    $_SERVER['SERVER_PORT'];			//服务器所使用的端口 
    $_SERVER['SERVER_SIGNATURE'];		//包含服务器版本和虚拟主机名的字符串。 
    $_SERVER['PATH_TRANSLATED'];		//当前脚本所在文件系统(不是文档根目录)的基本路径。 
    $_SERVER['SCRIPT_NAME'];			//包含当前脚本的路径。这在页面需要指向自己时非常有用。 
    $_SERVER['REQUEST_URI'];			//访问此页面所需的 URI。例如,“/index.html”。 
    $_SERVER['PHP_AUTH_USER']; 			//当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。 
    $_SERVER['PHP_AUTH_PW']; 			//当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。 
    $_SERVER['AUTH_TYPE']; 				//当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型




	
	//正常服务器在接收到客户端请求时会做出如下处理
    $file_name = "测试.jpg";
        
    //php读取文件名时不支持中文,所以需要对中文名称进行转码(文件名默认需要使用 gb2312 的编码)
    $file_name = iconv('utf-8', 'gb2312', $file_name);        

    if (!file_exists($file_name)) {
        echo "文件不存在";
        exit;
    }
        
    //获取文件大小,以字节为单位
    $file_size = filesize($file_name);
        
    //打开文件,可读方式打开
    $file = fopen($file_name, 'r');
        
    //返回数据给浏览器
    //下载文件需要的头
    header("Content-type: application/octet-stream"); //告知浏览器返回的是流文件的形式
    header("Accept-Ranges: bytes");    //按字节返回文件内容
    header("Accept-Length: $file_size"); //返回文件大小
    //这里可以设置浏览器端下载窗口所显示的文件名称
    header("Content-Disposition: attachment; filename=". $file_name);
        
    //定义缓冲区大小,字节为单位
    $buffer_size = 1024; 
        
    //为了保证 feof($file) 的可用性,可以考虑做一个文件字节读取计数器
    $file_count = 0;
        
    //向客户端循环发送数据,这样可以避免瞬间压力, feof用来判断文件指针是否到结尾
    while( !feof($file) && (($file_size - $file_count) > 0)){
        $buffer_data = fread($file, $buffer);
        $file_count += $buffer;
        //把部分数据回送给浏览器
        echo $buffer_data;
    }
        
    fclose($file);




/** php下载类,支持断点续传
 *  Date:  2013-06-30
 *  Author: test
 *  Ver:  1.0  *
 *  Func:
 *  download: 下载文件
 *  setSpeed: 设置下载速度
 *  getRange: 获取header中Range
 */
class FileDownload
{
    // class start
    private $_speed = 512;  // 下载速度

    /** 下载
     * @param String $file 要下载的文件路径
     * @param String $name 文件名称,为空则与下载的文件名称一样
     * @param boolean $reload 是否开启断点续传
     */
    public function download($file, $name = '', $reload = false)
    {
        if (file_exists($file)) {
            if ($name == '') {
                $name = basename($file);
            }
            $fp = fopen($file, 'rb');
            $file_size = filesize($file);
            $ranges = $this->getRange($file_size);
            header('cache-control:public');
            header('content-type:application/octet-stream');
            header('content-disposition:attachment; filename=' . $name);
            if ($reload && $ranges != null) {
                // 使用续传
                header('HTTP/1.1 206 Partial Content');
                header('Accept-Ranges:bytes');
                // 剩余长度
                header(sprintf('content-length:%u', $ranges['end'] - $ranges['start']));
                // range信息
                header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size));
                // fp指针跳到断点位置
                fseek($fp, sprintf('%u', $ranges['start']));
            } else {
                header('HTTP/1.1 200 OK');
                header('content-length:' . $file_size);
            }
            while (!feof($fp)) {
                echo fread($fp, round($this->_speed * 1024, 0));
                ob_flush();
                //sleep(1); // 用于测试,减慢下载速度
            }
            ($fp != null) && fclose($fp);
        } else {
            return '';
        }
    }

    /** 设置下载速度
     * @param int $speed
     */
    public function setSpeed($speed)
    {
        if (is_numeric($speed) && $speed > 16 && $speed < 4096) {
            $this->_speed = $speed;
        }
    }

    /** 获取header range信息    
     * @param int $file_size 文件大小    
     * @return Array 
     */
    private function getRange($file_size)
    {
        if (isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])) {
            $range = $_SERVER['HTTP_RANGE'];
            $range = preg_replace('/[\s|,].*/', '', $range);
            $range = explode('-', substr($range, 6));
            if (count($range) < 2) {
                $range[1] = $file_size;
            }
            $range = array_combine(array('start', 'end'), $range);
            if (empty($range['start'])) {
                $range['start'] = 0;
            }
            if (empty($range['end'])) {
                $range['end'] = $file_size;
            }
            return $range;
        }
        return null;
    }
}



//用来标识方法,使其不能被子类重载
class MyClass {
    final function method() {}
}

//用来标识类,使其不能被继承
final class MyClass {
}
class ExtendClass extends MyClass {
    //这个地方不能继承一个被final修饰的类
}



//你可以再类中声明一个__clone()方法,它将在克隆过程中被调用(调用的过程,在属性和方法从源对象复制过来以后进行)

class MyClass {
    function __clone() {
        echo "对象正在被克隆";
    }
}
$obj = new MyClass();

$obj_copy = colne $obj; //克隆一个对象




//用来定义在类中使用的常量(注意:在类中使用常量的时候都要使用这个)
class MyClass {
    const SUCESS = "Sucess";
}
print MyClass::SUCESS



//类的定义现在包含静态成员(属性),可以通过类自身来访问。通常用的最多的是单例模式
class Singleton {
    //静态成员
    static private $instance = NULL;
    //单例模式通常也定义 __clone方法,防止通过外部克隆当前类
    private function __clone(){
    }
    //私有的构造类,保证外部无法访问
    private function __construct() {
    }
    //静态方法
    static public function getInstance() {
        if (self::$instance == NULL) {
            self::$instance = new Singleton();
        }
        return self::$instance;
    }
}



//把类声明为抽象类可以防止它被实例化。但是你可以继承一个抽象类:
abstract class MyBaseClass{
    function display(){
        print "测试";
    }
}

	


//把方法声明为抽象,以便在继承的子类中再去定义。包含抽象方法的类本身必须是一个抽象类:
abstract class MyClass{
    abstract function display();
}



//函数声明中可以对参数进行对象类型提示。如果函数调用的时候没有传递正确的对象类型,系统会报错
class MyClass() {
}
function expectsMyClass(MyClass $obj) {
    //也就是这个对象必须是指定的MyClass对象的实例
}



//PHP4
$dummy = $obj->method();
$dummy->method2();

//PHP5开始支持链式函数调用
$obj->method()->method2();



//PHP5允许PHP类和PHP继承类实现Iterator接口。在实现迭代接口后,你可以用foreach语言结构遍历一个类的实例:

$obj = new MyTteratorImplementation();
foreach($obj as $value) {
    print "$value";
}



function __autoload($class_name) {
    Class2();

//PHP5同样新增了try/throw/catch 架构的异常处理规范。使用时,你只能抛出从Exception 类继承的对象:
class SQLException extends Exception {
    public $problem;
    function __contruct($problem) {
        $this->problem = $problem;
    }
}

try {
    throw new SQLException("Couldn't connect to database");
} catch (SQLException $e) {
    print "";
} catch (Exception $e) {

}



foreach ($arr as $key => $value) {
    $new_value = array('name' => 3);
    $arr[$key] = $new_value;
}
//在循环中使用引用改变value的值更简洁
foreach ($arr as $key => &$value) {
    $value = array('name' => 3);
}

//给引用参数设置默认值

//你可能认为只有 传递值的参数可以设置默认值,现在PHP5中也可以给引用参数设置默认值
function my_func(&$arg = null) {
    if ($arg == null) {
        print '$arg is empty';
    }
}
my_func();



//变量的间接引用使用两个 $ 符号
$name = "John";
$$name = "user";
print $John;  //这个变量被定义是因为上一行的间接引用 使得这个变量生效
//通过在变量的前面增加附加的 $ 标记,你可以任意增加引用次数
$$$name = 'user1';
print $user; //这个变量也会被定义



$name = "test";
unset($name);
if (isset($name)) {
    print 'test';
}
//这个例子不会生成任何输出。
//unset还可以用来检查数组的元素和对象的属性,就跟isset()一样。



$str = <<<THE_END
    ASDFASDFASDF
    ASDFSDAFDASFFASFADSFDDASFASDFASF
THE_END;



$a = '11111';
$i = 10;
$a[$i] = 2;
echo $a;
//会输出  '11111 2'   注意中间补白的空格;


$arr1 = array(1, 2, 3);

$arr2[0] = 1;

echo $arr2[0];

//当然有更多用法不再解释,请参考文档

foreach($array as [$key =>] [&] $value){
    //....
}

$players = array('1', '2', '3');
reset($players); //将数组内部的指针指向第一个单元,使用each之前一定要使用reset使指针指向第一个单元
while( list($key, $val) = each($players) ){
    echo $key.'='.$val;
}


$ages = array('john' => 28, 'bar' => 67);
reset($ages);
$person = each($ages);  //返回 Array ( [1] => 28 [value] => 28 [0] => john [key] => john )
//可以有两种访问方式
$name = $person['key'];
$name = $person[0];