语法

  • &:引用值,非拷贝
  • @:抑制报错
  • $$:定义可变变量(引用传递),意义不明
$str = 'world';
$first = "hello";
$hello = "$str";
echo $first . " " . $$first;
// 输出:hello world
  • $val():可变函数
  • <=>:组合比较,等于返回0,否则返回1/-1
  • ?::简写三目

    # 这句输出 'str'
    echo 'str' ?: 'false';
  • ??:判空,返回从左到右第一个不为空的变量

关键字

  • do-while:类似于while,先执行后判断,即使为false也会执行一次,当第一次条件不为false时和while基本没区别.
  • foreach:遍历数组,foreach($arr as &$value){}
  • goto:跳转到指定位置,用return结束代码块.
  • break:结束当前循环,加n可以指定跳出多少层循环,不加默认1.
  • continue:终止本次循环,不执行后续代码块并进入下一次循环,同样可以加n.
  • namespace:命名空间,用于同名函数,调用时使用use function first\func;func();或者second\func();

注释规范

/**
* @name 名字
* @abstract 申明变量/类/方法
* @access 指明这个变量、类、函数/方法的存取权限
* @author 函数作者的名字和邮箱地址
* @category  组织packages
* @copyright 指明版权信息
* @const 指明常量
* @deprecate 指明不推荐或者是废弃的信息MyEclipse编码设置
* @example 示例
* @exclude 指明当前的注释将不进行分析,不出现在文挡中
* @final 指明这是一个最终的类、方法、属性,禁止派生、修改。
* @global 指明在此函数中引用的全局变量
* @include 指明包含的文件的信息
* @link 定义在线连接
* @module 定义归属的模块信息
* @modulegroup 定义归属的模块组
* @package 定义归属的包的信息
* @param 定义函数或者方法的参数信息
* @return 定义函数或者方法的返回信息
* @see 定义需要参考的函数、变量,并加入相应的超级连接。
* @since 指明该api函数或者方法是从哪个版本开始引入的
* @static 指明变量、类、函数是静态的。
* @throws 指明此函数可能抛出的错误异常,极其发生的情况
* @todo 指明应该改进或没有实现的地方
* @var 定义说明变量/属性。
* @version 定义版本信息
*/
function func(){
// 鬼知道为什么要写在函数上面,太怪了

}

Class 类

  1. 关于类

类的命名规则采用单词首字母全大写的方式,如 PluginInterface.如果引用了其他文件中的类,并且可能存在重名类则采用 use Typecho\Widget\Helper\Form\Element\Radio as Typecho_Widget_Helper_Form_Element_Radio; 的方式命名.

但类名是不区分大小写的.

  1. 作用域

作用域有三种: public , privateprotected ,后两种只能在类内调用.

class DatabaseConnection{

    const PORT = 3307;
    public $dbHost = 'kazusa.cc';
    private $dbUser = 'user';
    protected $dbPassword = 'pwd';

    public function result(){
        $rs = $this->dbUser . $this->dbPassword; // 调用后两种作用域变量

        echo self::PORT; // 类内调用常量

        $this->test(); // 调用其他方法

        return $rs;
    }
}

$obj = new DatabaseConnection; // 实例化,括号加不加都行

echo $obj->result(); // 调用公有函数

echo $obj::PORT; // 调用常量

echo $obj->dbHost; // 调用公有变量
  1. 修饰符

也有三种: const , final , static.

目前还不清楚怎么用后两种.

超☆级☆全☆局☆变☆量

$GLOBALS:储存的是全部变量,键为变量名,全作用域可用
$_SERVER:服务器信息,如脚本路径,头信息等
$_REQUEST:表单数据,对于正常fetch提交表单来说,POST是接收不到的,这个应该可以(有待查证)
$_GET&$_POST:顾名思义
$_FILES:?
$_ENV:顾名思义,基本用不着
$_COOKIE:setcookie(name, value, expire, path, domain);,就我而言,只需要前三个参数就够了(其实不用也行)
$_SESSION:使用前必须session_start();,在登出场景中使用session_destroy();来销毁会话

在使用地址重写时发现,$_SERVER可以获取到当前URL的请求参数部分,而其他两种方法则只能获取到重写规则内添加的参数.比如当前URL实际请求三个参数,但重写时抹除了?后的内容并重新写了一个参数,则$_SERVER可以获取三个,$_GET只能获取一个.

函数

  • parse_url():顾名思义,填入一个(完整的)URL,然后就会生成一个长度为4的数组,键值是后面这四个.(scheme,host,path,query),值得一提的是不完整的也行.以//开头则显示后三个参数,直接以域名开头只有最后两个,以相对路径也是两个.
  • extract($arr):将二维数组中的键作为变量名,值作为变量值,返回值为设置成功的条数(高危,但平时用方便.
  • explode():分割字符串为数组,需要注意的是分割符在前,需要被分割的字符串在后.
  • implode():逆explode(),使用拼接符连接数组,同样连接符在前.
  • join(): implode 别名, 等效.
  • extract($row): 将变量从数组导入到当前
# 记录一些可能用到的代码

# 获取 IP
function getIP()
{
    if (getenv('HTTP_CLIENT_IP')) {
        return getenv('HTTP_CLIENT_IP');
    } elseif (getenv('HTTP_X_FORWARDED_FOR')) {
        return getenv('HTTP_X_FORWARDED_FOR');
    } elseif (getenv('HTTP_X_FORWARDED')) {
        return getenv('HTTP_X_FORWARDED');
    } elseif (getenv('HTTP_FORWARDED_FOR')) {
        return getenv('HTTP_FORWARDED_FOR');
    } elseif (getenv('HTTP_FORWARDED')) {
        return getenv('HTTP_FORWARDED');
    } else {
        return $_SERVER['REMOTE_ADDR'];
    }
}

字符串

  • trim():去除字符串首尾的特殊符号/指定的字符(可选)
  • strcmp():比较两个字符串,返回int型,0为完全相等.(还有一个不区分大小写的)
  • str_split():也是分割字符串,按(字节)长度,因为中文占三字节,个人感觉不适用于中英混合的情况
  • strpos():定位字符串第一次出现的位置,并返回下标.第三个参数是offset.区分大小写
  • strrpos():定位最后一次出现的位置.
  • stripos():同strpos(),不区分大小写.
  • strripos():定位最后,不区分.
  • strstr():查找首次出现的位置,并返回一半(这到底有什么用?)
  • strchr():查找最后一次并返回.
  • substr():截取字符串.
  • substr_count():检索出现字符串的次数.
  • substr_replace():字符串替换,可以设置替换的长度,为0是插入
  • str_replace():替换字符串(更常用)
  • strrev():字符串反转

数组

  • array_key():获取所有键命,返回数组,value也一样
  • in_array():返回布尔值
  • array_search:搜索值返回键名,否则返回false
  • array_key_exists():搜索键,返回布尔值

数组元素操作

  1. 添加删除

array_pop():删除最后一个并返回值

array_push():在数组末尾添加一个或多个元素

array_shift():删除第一个元素并返回值

array_unshift():在数组开头添加~

array_unique():删除重复元素

unset():删除指定位置的元素

  1. 切片合并

array_merge():合并多个数组

array_rand():随机选出多个元素为新数组并返回

array_slice():截取指定长度和偏移,返回新数组

懒得写了,剩下的基本用不着.