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];