月度归档: 2016 年 3 月

  • PHP 魔术变量

    所有魔术变量表示的值均区分大小写

    __CLASS__

    表示代码所在类的名字

    // 文件 define.php
    namespace Base
    {
        abstract class Fruit
        {
            public function __construct()
            {
                // 输出 Base\Fruit
                echo __CLASS__;
                echo "\n";
                // 输出 Sub\Apple
                echo get_class($this);
                echo "\n";
            }
    
            public function hello()
            {
                // 输出 Base\Fruit
                echo __CLASS__;
                echo "\n";
            }
        }
    }
    
    namespace Sub
    {
        class Apple extends \Base\Fruit
        {
            public function say()
            {
                // 输出 Sub\Apple
                echo __CLASS__;
                echo "\n";
            }
        }
    }
    
    // 文件 test.php
    require __DIR__ . '/define.php';
    
    $Apple = new Sub\Apple();
    $Apple->hello();
    $Apple->say();
    

    __DIR__

    表示代码所在文件所在的完整目录名,等价于 dirname(__FILE__),不包括末尾的斜杠 /

    // 文件 test.php
    // 输出 test.php 所在目录 /opt/wwwroot/test
    echo __DIR__;
    echo "\n";
    

    __FUNCTION__

    表示代码所在函数的名称

    function foo()
    {
        // 输出函数名 foo
        echo __FUNCTION__;
        echo "\n";
    }
    foo();
    

    __FILE__

    表示代码所在文件的完整路径名

    // 文件 test.php
    // 输出 test.php 所在目录 /opt/wwwroot/test/test.php
    echo __FILE__;
    

    __LINE__

    表示代码所在文件中的行号

    // 文件 test.php
    // 输出代码行号
    echo __LINE__;
    

    __METHOD__

    表示代码所在函数的名称

    // 文件 define.php
    namespace Base;
    
    function foo()
    {
        // 输出函数名 Base\foo
        echo __FUNCTION__;
        echo "\n";
        // 输出函数名 Base\foo
        echo __METHOD__;
        echo "\n";
    }
    
    class Foo
    {
        public function bar()
        {
            // 输出函数名 bar
            echo __FUNCTION__;
            echo "\n";
            // 输出方法名 Base\Foo::bar
            echo __METHOD__;
            echo "\n";
        }
    
        public static function staticBar()
        {
            // 输出函数名 staticBar
            echo __FUNCTION__;
            echo "\n";
            // 输出方法名 Base\Foo::staticBar
            echo __METHOD__;
            echo "\n";
        }
    }
    
    // 文件 test.php
    require __DIR__ . '/define.php';
    
    Base\foo();
    
    $foo = new Base\Foo();
    $foo->bar();
    $foo->staticBar();
    

    __TRAIT__

    表示代码所在 trait 的名称,包含完整限定的 namespace

    // 文件 define.php
    namespace Base
    {
        trait Wheel
        {
            public function roll()
            {
                // 输出 Base\Wheel
                echo __TRAIT__;
                echo "\n";
                // 输出 Sub\Car
                echo __CLASS__;
                echo "\n";
            }
        }
    }
    
    namespace Sub
    {
        class Car
        {
            use \Base\Wheel;
    
            public function start()
            {
                $this->roll();
                // 输出空字符串
                echo __TRAIT__;
                echo "\n";
                // 输出 Sub\Car
                echo __CLASS__;
                echo "\n";
            }
        }
    }
    
    // 文件 test.php
    require __DIR__ . '/define.php';
    
    $car = new Sub\Car();
    $car->start();
    

    __NAMESPACE__

    表示当前代码所在命名空间

    namespace Vendor\Util;
    
    // 输出命名空间 Vendor\Util
    echo __NAMESPACE__;
    echo "\n";
    
    function foo()
    {
        // 输出命名空间 Vendor\Util
        echo __NAMESPACE__;
        echo "\n";
    }
    
    foo();
    
  • mysqldump 命令

    mysqldump 常用操作命令

  • PHP 超全局变量

    PHP 超全局变量(Superglobal)是自动化的全局变量,在任何作用域都可以使用,不需要使用 global 关键字声明 $variable。

    变量名 说明
    $GLOBALS 引用了全部全局变量的数组,如 $GLOBALS[‘_GET’]、$GLOBALS[‘_POST’] 等等,以及一个对自身 GLOBALS 的引用。
    $_COOKIE PHP 解析浏览器请求携带的 cookie 生成的数组
    $_ENV $_ENV 包含当前的环境变量,与 phpinfo() 输出的 Environment 表格一致,但默认为空,通过 getenv() 可以获取到指定的环境变量
    $_FILES $_FILES 包含当前 HTTP POST 上传的文件列表。
    $_GET $_GET 包含 URL 参数列表
    $_POST $_POST 包含 POST 参数列表
    $_REQUEST 可能包含 $_GET、$_POST、$_COOKIE,不包含 $_FILES。 request_order 控制包含的参数列表。
    $_SERVER 包含服务器和脚本执行环境信息,比如 HTTP 请求头信息、脚本信息,不同服务器信息会有不同。
    $_SESSION 包含当前 SESSION 变量列表。需要先调用 session_start() 开启会话。
    $argc 以命令行(CLI)形式运行 PHP 脚本,传递给脚本的参数总数。需要开启 register_argc_argv
    $argv 以命令行(CLI)形式运行 PHP 脚本,传递给脚本的参数数组。需要开启 register_argc_argv
    $http_response_header 保存当前作用域下最新 HTTP 请求的的响应头信息
    $php_errormsg 开启 track_errors 时,PHP 执行的最新错误信息

    $GLOBALS

    $name = 'Seven';
    function hello() {
    	$name = 'Eight';
    	echo "local name is $name"; // Eight
    	echo "\n",
    	echo "global name is "
    		. $GLOBALS['name']; // Seven
    }

    php.ini 中的 register_globals(在 PHP 5.4.0 中被移除)表示将 globals 变量中的成员自动注册为全局变量。

    // 设置 register_globals = on;
    $_GET['name'] = 'Seven';
    $name === $_GET['name']; // true
    
    // 设置 register_globals = off;
    // 不会将 global 变量中的成员自动注册为全局变量
    

    $_COOKIE

    $_COOKIE 包含当前请求的 cookie 列表,在请求中使用 setcookie 再调用 $_COOKIE 不会立刻获得相同的值。

    // 设置 cookie
    setcookie('name', 'Seven');
    // 获取 cookie
    $_COOKIE['name'] // 不能立刻获得设置的 cookie
    // 因为 $_COOKIE 存放的是当前浏览器发送到服务器的 cookie
    // 其次, setcookie 不一定设置 cookie 成功
    

    $_ENV

    默认的 $_ENV 数组为空,是因为 variables_order可能没有包含 E —— _ENV。

    CEGPS 分别对应 $_COOKIE、$_ENV、$_GET、$_POST、$_SERVER,variables_order 的默认值没有包含 E,因此不会设置超全局变量 $_ENV。variables_order 为空则不会设置任何超全局变量。

    $_FILES

    $_FILES 包含的是文件列表,是一个二维数组,一般结合 move_uploaded_file() 将上传的文件存放到需要的位置,类似结构如下:

    array(
    	// myfile 是 input 表单的 name 属性
    	'myfile' => array(
    		'name' => '', // 文件的原名称
    		'type' => '', // 文件的 MIME 类型
    		'size' => '', // 文件的字节大小
    		'tmp_name' => '', // 存放的包含路径的临时文件名
    		'error' => '', // 上传的错误代码
    	);
    );
    // 如果 php 对 upload_tmp_dir 没有写入权限,
    // 则上传的文件无法存放在文件系统上
    

    $_GET

    $_POST

    $_POST 只解析类似 URL 参数列表结构的 POST BODY 中的数据,比如将 name=Seven 解析为 $_POST[‘name’] = Seven,调用 AJAX XMLHttpRequest 的 send() 方法传递的字符串一般类似 name=Seven&age=20。
    $_POST 不能解析文件流,也不能解析 send() 的 JSON 字符串,需要使用 @file_get_contents(‘php://input’) 获取 POST 的内容,再进行解析——比如 json_decode 获得 JSON,base64_decode 获得二进制流。

    $_REQUEST

    // request_order = 'GP'
    // 表示 $_REQUEST 包含 $_GET、$_POST 内容
    // 同名 key 后者覆盖前者
    
    // request_order = 'GPC'
    // 表示 $_REQUEST 包含 $_GET、$_POST、$_COOKIE 内容
    

    $_SERVER

    $_SERVER['HTTP_HOST'] // HTTP 请求的主机
    $_SERVER['HTTP_USER_AGENT'] // HTTP 请求 User-Agent
    $_SERVER['HTTP_COOKIE'] // HTTP 请求 COOKIE
    $_SERVER['HTTP_ACCEPT_LANGUAGE'] // 可以接受的语言列表
    // 与 HTTP 请求相关的信息大部分以 HTTP_ 开始
    

    get_defined_functions

    返回一个二维数组,包含定义的函数名列表:区分 internal、user。

    // get_defined_functions 返回值
    array (
    	'internal' => array (
    		'zend_version',
    		'func_num_args',
    		'func_get_arg',
    		// ...
    	),
    	'user' => array (
    		'get_client_ip',
    		'get_client_device',
    		'get_client_browser',
    	),
    );
    

    get_defined_constants

    返回定义的常量数组,常量名作为 key,常量值作为 value。

    get_defined_vars

    返回定义的变量数组。

    extract

    将数组的成员导入到当前作用域。

    $a = array(
    	'b' => 'b',
    );
    extract($a);
    echo $b; // 输出字符串 b
    // 如果数组的成员与当前变量名重名会发生什么?
    
  • 网页加载优化 DNS 预解析

    网站功能越来越复杂,除了主站域名、CDN域名、图片域名、接口域名,还可能有第三方分享、OAuth认证。

    <!-- 1, 通过设置 header 或者 meta 标签
        设置 x-dns-prefetch-control 为 on -->
    <meta http-equiv="x-dns-prefetch-control" content="on">
    <!-- 2, 通过 link 标签指定要预解析的域名 -->
    <link rel="dns-prefetch" href="//s.zhengxianjun.com">
    

    附:DNS解析过程

  • 对比jQuery和Zepto

    对比两者到2016年3月8号最新的版本 jQuery 2.2.1 http://jquery.com/ 和 Zepto 1.1.6 http://zeptojs.com/

    简单对比

    jQuery 2.2.1 Zepto 1.1.6
    文件大小
    浏览器支持
  • Internet Explorer 9+
  • Chrome, Edge, Firefox (Current – 1) or Current
  • Safari 5.1+
  • Opera 12.1x, (Current – 1) or Current
  • iOS 6.1+
  • Android 2.3, 4.0+
  • Primary (100% support)

  • Safari 6+ (Mac)
  • Chrome 30+ (Windows, Mac, Android, iOS, Linux, Chrome OS)
  • Firefox 24+ (Windows, Mac, Android, Linux, Firefox OS)
  • iOS 5+ Safari
  • Android 2.3+ Browser
  • Internet Explorer 10+ (Windows, Windows Phone)
  • Secondary targets (fmenuly or mostly supported)

  • iOS 3+ Safari
  • Chrome <30
  • Firefox 4+
  • Safari <6
  • Android Browser 2.2
  • Opera 10+
  • webOS 1.4.5+ Browser
  • BlackBerry Tablet OS 1.0.7+ Browser
  • Amazon Silk 1.0+
  • Other WebKit-based browsers/runtimes
  • 成员函数数量
    工具函数数量
    授权协议 无特殊说明均为MIT MIT

    详细对比