zoukankan      html  css  js  c++  java
  • php--base

    1 理念

    • 一个网站就是一个文件夹
    • 一个网页就是一个文件

    2 一些概念

    • url 统一资源定位器
    • 网址:协议:域名[端口号][路径][文件名]

    3 变量

    • 以 $ 开始
    • 紧接着必须是数字或字母
    • 之后的还可以是数字
    • 不能是关键字
    • 尽量见名知意
    • 推荐小驼峰

    4 debug 辅助函数

     

    4.1 echo

    • true -> 1
    • false/null/NULL 没有输出
    • null 什么都没有输出

    4.2 var_dump($x)

    输出变量(必须定义)的详细信息

    5 显示时间信息

    echo date('Y-m-d H:i:s');
    echo idate('w'); // week info
    

    6 操作变量

    • 赋值
    • 取值
    • 判断是否存在:isset($x); null 和 未定义为 false,其他为 true
    • 销毁:unset($x); 之后使用变量就是未定义,需要重新定义

    7 引用

    类似 C++ 的引用,可以看成是别名(数据中的内存是同一地址)

    $a = 1000;
    $b = &$a;
    $a = 100;
    

    8 预定义变量

     

    8.1 获取请求的参数

    • $_GET get 请求
    • $_POST post 请求
    • $_REQUEST (不分是 get 还是 post 请求)
    <?php
    $l = $r = $result = '';
    if (isset($_REQUEST['l']) && $r = $_REQUEST['r']) {
        $l = $_REQUEST['l'];
        $r = $_REQUEST['r'];
        $result = $l + $r;
    }
    ?>
    <!--同时有 post get 数据-->
    <form action="calc2.php?name=elem&age=12" method="post">
        <div>
        <input type="text"
               name="l"
               value="<?php echo $l; ?>"/>
        +
        <input type="text"
               name="r"
               value="<?php echo $l; ?>"/>
        <input type='submit' value="计算">
        <?php echo $result ?>
        </div>
    </form>
    

    8.2 $_SERVER

    仅列出一些简单的,剩下需要查手册

    echo '<p>php file: ', $_SERVER['PHP_SELF'];
    echo '<p>domain name: ', $_SERVER['SERVER_NAME'];
    echo '<p>server ip: ', $_SERVER['REMOTE_ADDR'];
    echo '<p>document root path: ', $_SERVER['DOCUMENT_ROOT'];
    echo '<p>script name: ', $_SERVER['SCRIPT_NAME'];
    echo '<p>client ip: ', $_SERVER['REMOTE_ADDR'];
    

    9 可变变量

    使用变量名找变量

    $a = 1;
    $b = 'a';
    $c = 'b';
    //$$$c;
    //$$b;
    //$a
    echo $$$c;
    

    10 常量

     

    10.1 const

    定义时只能使用字面量和简单计算的表达式

    const AGE = 100;
    
    echo 'len: ', LEN * 2 - 71;
    echo '<br/>age: ', AGE * 2 - 33;
    

    10.2 define

    定义时值可以是复杂的表达式

    define('LEN', 100);
    
    echo 'len: ', LEN * 2 - 71;
    echo '<br/>age: ', AGE * 2 - 33;
    
    //避免冲突
    $varName = 'AGE';
    if(!defined($varName)){
        define($varName, 11);
    }
    echo '<br/>const value ', $varName, ' : ',constant($varName);
    

    10.3 预定义常量

    列了一些,其他查手册

    echo '<br/>', PHP_VERSION;
    echo '<br/>', PHP_OS;
    echo '<br/>', PHP_INT_MAX;
    echo '<br/>', M_PI;
    

    10.4 魔术常量

    列了一些,其他查手册

    echo '<br/>', __DIR__;
    echo '<br/>', __FILE__;
    echo '<br/>', __LINE__;
    //echo '<br/>', __FUNCTION__;
    

    11 进制

    使用内置的函数

    //进制转换
    $a = 0x111;
    $c = 111;
    $b = 0111;
    $d = 0b111;
    
    echo '<br/> 0x111: ' . $a;
    echo '<br/> 111: ' . $b;
    echo '<br/> 0111: ' . $c;
    echo '<br/> 0b111: ' . $d;
    
    //10进制转其他
    $v = 100;
    echo '<br/>100->16: ', '0x', dechex($v);
    echo '<br/>100->8: ', '0', decoct($v);
    echo '<br/>100->2: ', '0b', decbin($v);
    
    echo '<br/>011: ',octdec('011');
    

    12 浮点数

    浮点数相等操作不可靠,不要随便进行比较(一般转整数比较)

    echo '<br/>1.6: ', 1.6;
    echo '<br/>1.23e3: ', 1.23e3;
    

    13 布尔值

    • true
    • false

    14 字符串

    • 单引号不会解析
    • 双引号中会解析变量($x)
    • 双引号中变量转义后不会解析,$x 只会生效一次,不解析的都需要转义
    • 显示指定变量
    $s = 'hello';
    //效果相同
    echo "<br/>$s";
    echo "<br/>{$s}";
    echo "<br/>".$s;
    echo '<br/>'.$s;
    
    //效果相同
    echo "<br/>$s: $s";
    echo "<br/>$s: {$s}";
    echo '<br/>$s: '.$s;
    echo '<br/>$s: ',$s;
    
    //连接字符串不带空格也可以解析
    echo "{$s}sss";
    
    var_dump('abc' . '-' . true . null . '-' . false . 'ok'); //abc-ok
    $a = 'abc';
    $a .= '123';
    var_dump($a); //abc123
    
    • nowdoc/heredoc
    //heredoc 类似 单引号
    $s = 'abc';
    $s1 = <<< 'aa'
    hello s1 = ${s}bb
    aa;
    var_dump($s1); //hello s1 = ${s}bb
    
    //nowdoc 字符串
    $s2 = <<< "bb"
    hi s2 = ${s1}
    bb;
    
    var_dump($s2); //'hi s2 = hello s1 = ${s}bb
    
    //标识符结束所在行只能写标识符紧跟着分号,不能出现空白字符
    if ("b" > 'a') {
        $s1 = <<< 'iii'
    这个只能这样子写
    iii;
    }
    

    15 数组

     

    15.1 基本使用

    //等价,方括号新版本支持,$_GET, $_POST 就是数组
    //key 0..
    $p1 = array('alex', 18, 'sex');
    $p2 = ['alex', 18, 'sex'];
    //key name age gender
    $p3 = array('name' => 'xiaoli', 'age' => 10, 'gender' => 'male');
    $p4 = ['name' => 'xiaoli', 'age' => 10, 'gender' => 'male'];
    
    //定义并初始化数组
    $other['name'] = 'student';
    
    //使用属性,下标和名称
    echo "<br/>$p1[0]: $p1[0]";
    echo "<br/>$p3[name]: $p3[name]";
    echo "<br/>";
    echo "<pre>";//为了清晰显示原始结构
    print_r($p1, null);
    echo "</pre>";
    

    15.2 分类

     

    15.2.1 种类划分

    • 索引数组:索引是从0开始的整数
    • 关联数组:索引都是有意义的字符串(大致这么个意思)

    15.2.2 维数划分

    • 一维数组
    • 多维数组(二位数组、三维数组…)
    • 异型数组(不整齐数组)
    $arr = [
        [1, 2,'ab'],
        [1]
    ];
    

    15.3 索引

    • 有索引使用索引
    • 没有索引的下标从0开始的整数 0 1 2 3
    • 有索引且为整数,之后没有索引的下标接着逐个增加
    • 索引会修改下标的启示值,会造成覆盖现象
    $arr = [
        'name' => 'elex',
        18,
        "10" => '50kg',
        110,
        'gender' => 'male',
        180,
        11 => 'reset'
    ];
    //array (size=6)
    //  'name' => string 'elex' (length=4)
    //  0 => int 18
    //  10 => string '50kg' (length=4)
    //  11 => string 'reset' (length=5)
    //  'gender' => string 'male' (length=4)
    //  12 => int 180
    var_dump($arr);
    

    15.4 Fibonacci 数列

    //Fibonacci 0 1 1 2 3 5 7
    function Fibonacci($n)
    {
        $beg = 0;
        $end = 1;
        for ($i = 0; $i < $n; ++$i) {
        $tmp = $end;
        $end = $beg + $end;
        $beg = $tmp;
        }
        return $beg;
    }
    
    for ($i = 0; $i < 10; ++$i) {
        var_dump(Fibonacci($i));
    }
    

    15.5 遍历

     

    15.5.1 foreach

    $arr = [['age' => 1, 2, 3], ['height' => 6]];
    $count = 0;
    $sum = 0;
    foreach ($arr as $a) {
        foreach ($a as $key => $val) {
        var_dump($key);
        ++$count;
        $sum += $val;
        }
    }
    var_dump('srm: ' . $sum);
    var_dump('avg: ' . ($sum / $count));
    

    15.5.2 数组指针

    //操作数组指针函数
    $arr = [[1, 3, 3], [2, 1]];
    reset($arr);
    $sum = $count = 0;
    for ($key = key($arr); isset($key); next($arr), $key = key($arr)) {
        for ($a = current($arr), $k = key($a); isset($k); next($a), $k = key($a)) {
        ++$count;
        $sum += current($a);
        }
    }
    var_dump("sum: ${sum}, count: ${count}, avg: " . ($sum / $count));
    
    

    16 空类型

    null/NULl 不区分大小写

    echo false . 'abc'; // abc
    echo null . 'abc'; // abc
    $a = null;
    var_dump(isset($a)); // false
    

    17 获取、设置、设置类型

    echo gettype('123'); // string
    $a = 123;
    settype($a, 'string'); 
    echo gettype($a); // string
    
    //判断是否为某类型                // 
    var_dump(is_numeric(123)); // true
    var_dump(is_numeric('123')); // true
    var_dump(is_array([])); // true
    var_dump(is_int(10)); // true
    

    18 判断是否为空

    $a = null;
    //只能判断变量,undefined/null -> false, else true
    var_dump(isset($a));
    //基本类型是空和未定义都返回 true
    unset($a);
    var_dump(empty(null)); //true
    var_dump(empty($a)); //true
    var_dump(empty([])); //true
    var_dump(empty('')); //true
    

    19 自动、强制类型转换

    //自动类型转换
    //@是禁止警告的意思
    //基本类型相加都会转数字
    @var_dump('11' + '7abc'); // 18
    @var_dump('11' + 'abc'); // 11
    var_dump('11' + false); // 11
    var_dump('11' + true); // 12
    var_dump('11' + null); // 11
    var_dump(10.9 % 3.3); //1 (直接向下取整)
    $a = 'abc';
    @$a += 'abc';
    var_dump($a); //0
    
    //强制转换
    var_dump((int)'111'); //int 111
    var_dump((int)'abc'); //int 0
    

    20 比较运算符

    全等类似 javascript,要求类型和值都相同

    var_dump(1 === '1'); // false
    var_dump(1 == '1'); // true
    var_dump(0 == '0'); // true
    var_dump(1 === true); // false
    var_dump(false == null); // true
    var_dump('aa' > 'b'); //false
    

    21 逻辑运算符

    && || !,可以利用短路计算

    22 位运算

    & | ~ ^: 按位与、或、非、异或

    //0000 0110 & 0000 1001 -> 0000 0000
    var_dump(6 & 9); // 0
    //<< >>:按位左移、右移
    //val */ 2 的 n 次方
    //0000 0010 << 4 -> 0010 0000
    var_dump(2 << 4); //32
    

    23 错误抑制符

    //用法,作用:去掉了警告
    @var_dump('1' + 'abc'); 
    

    一些错误提示不应该给用户看见(系统账号改密码之类的错误)

    24 运算符优先级

    • 括号有限,赋值最底
    • ! > 算数 > 比较 > 逻辑

    25 字符串拼接

    var_dump('abc' . '-' . true . null . '-' . false . 'ok'); //abc-ok
    $a = 'abc';
    $a .= '123';
    var_dump($a); //abc123
    

    26 自增/自减

    从左到右一段一段计算

    $a = 10;
    //11 + 11 + 13 + 14 + 14 + 16 从左到右计算
    $b = ++$a + $a++ + ++$a + ++$a + $a++ + ++$a;
    echo "$a=$a, $b=$b"; //$a=16, $b=69
    
    $a = 10;
    //10-9 + 8-8 + 8-7 + 7-6 + 6-5 + 4-4 + 4-3  从左到右计算
    //10 + 8 + 8 + 7 + 6 + 4 + 4(26 + 7 + 14)
    $b = $a-- + --$a + $a-- + $a-- + $a-- + --$a + $a--;
    echo "$a=$a, $b=$b"; //$a=3, $b=47
    

    27 流程结构

    类似 C 中的 if-else do-while for switch while

    //中断,可以中断几层
    //continue n 继续循环哪一层
    $n = 1;
    while(++$n < 1000){
        while(++$n < 500){
        while (++$n < 50){
            break 3;
        }
        }
    }
    var_dump($n); //4
    

    28 函数

     

    28.1 简单例子

    function add($a, $b)
    {
        return $a + $b;
    }
    
    var_dump(add(1, 5)); // 6
    

    28.2 按值传递

    function swap($a, $b)
    {
        $a ^= $b;
        $b = $b ^ $a;
        $a = $b ^ $a;
    }
    
    $oa = $na = 10;
    $ob = $nb = 20;
    swap($na, $nb);
    var_dump("$oa--$na"); //10--10
    var_dump("$ob--$nb"); //20--20
    

    28.3 按引用传递

    function swap(&$a, &$b)
    {
        $a ^= $b;
        $b = $b ^ $a;
        $a = $b ^ $a;
    }
    
    $oa = $na = 10;
    $ob = $nb = 20;
    swap($na, $nb);
    var_dump("$oa--$na"); //10--20
    var_dump("$ob--$nb"); //20--10
    

    28.4 递归

    使用了匿名函数、闭包、默认参数

    $factorial = function ($n) {
        $fn = function ($n, $product = 1) use (&$fn) {
        return $n <= 1 ? $product : $fn($n - 1, $n * $product);
        };
        return $fn($n);
    };
    
    var_dump($factorial(3) === 6); // true
    var_dump($factorial(5) === 120); // true
    

    28.5 可变参数

    function sum()
    {
        $len = func_num_args(); // args len
        $args = func_get_args(); // args arr
    //    $count = count($args); //count arr len
    //    var_dump($args);
    //    var_dump($len);
    //    var_dump($count); // arr len
        for($sum = $i = 0; $i < $len; ++$i){
        $sum += $args[$i];
        }
        return $sum;
    }
    
    var_dump(sum(1, 2, 3)); // 6
    

    28.6 函数简单应用

    function add($a, $b) {
        return $a + $b;
    }
    function mul($a, $b) {
        return $a * $b;
    }
    $_POST['method'] = 'add';
    $_POST['lhs'] = '15';
    $_POST['rhs'] = '20';
    $method = $_POST['method'] ? $_POST['method'] : null;
    if (function_exists($method)) {
        $lhs = $_POST['lhs'] ? $_POST['lhs'] : '';
        $rhs = $_POST['rhs'] ? $_POST['rhs'] : '';
        var_dump($method($lhs, $rhs));
    }
    

    28.7 作用域

    • 函数内外变量不能直接互相访问
    • static 变量只会初始化一次(相当于仅定义一次)
    function fn(){
        static $c = 5;
        return ++$c;
    }
    var_dump(fn()); // 6
    var_dump(fn()); // 7
    var_dump(fn()); // 8
    
    • 访问作用域外的变量
    $a = $b = 0;
    $b = 0;
    (function ($n) {
    //    方式 1,要写在函数顶部(重新声明后值会变)
    //    global 只能在函数中使用
        global $a;
        $a = +$n;
    
        global $a;
        $a += $n;
    //    方式 2, 使用特殊变量 GLOBALS
        $GLOBALS['b'] += $n;
    })(100);
    var_dump($a . '--' . $b); // 200--100
    

    29 导入文件

     

    29.1 使用方式和特点

    //相当于拷贝了三次文件的代码放到这
    //重复定义函数报错,但是代码会继续执行
    //include 和 require 类似,后者出错就停止往下执行 
    include './3scope.php';
    include './3scope.php';
    include './3scope.php';
    
    //相当于拷贝了一次
    //include_once 和 require_once 类似,后者出错就停止往下执行
    include_once './3scope.php';
    include_once './3scope.php';
    include_once './3scope.php';
    

    29.2 文件不带路径查找规则

    1. php.ini 中 include_path 指定的路径找
    2. 当前目录找
    3. 导入文件所在目录找

    29.3 路径相关函数

    //当前文件的绝对地址
    var_dump(__DIR__);
    //当前访问页面的绝对路径
    var_dump(getcwd());
    

    30 错误

     

    30.1 一些系统表示错误的常量

    例如:E_NOTICE、E_PARSE、E_WARNING、E_ERROR,都是整数值

    30.2 用户错误

    例如:E_USER_ERROR等和上面的类似(中间多了 user)

    30.3 触发用户错误

    trigger_error('触发的错误', E_USER_ERROR);
    

    30.4 系统级错误配置

    在 PHP 配置文件 php.ini 中修改

    # 显示所有错误
    error_reporting = E_ALL
    # 只显示指定错误
    error_reporting = E_NOTICE | E_PARSE
    # 开启或关闭错误显示
    display_error On | Off
    # 日志文件
    errors_log = filename
    # 开启或关闭日志
    log_errors = On | Off
    

    30.5 文件级别的错误设置

    //错误信息
    //1 on 2 off
    ini_set('display_errors', 1);
    ini_set('error_reporting', E_NOTICE | E_PARSE);
    
    //日志
    //1 on 2 off
    ini_set('log_errors', 1);
    ini_set('error_log', './error.log');
    

    30.6 自定义错误

    致命错误是系统处理,用户无权接管

    set_error_handler('my_error');
    function my_error($code, $msg, $file,$line){
        echo "<div>
    <p>错误码:$code</p>
    <p>错误信息:$msg</p>
    <p>触发文件:$file</p>
    <p>所在行:$line</p>
    </div>";
        var_dump($code.$msg.$file.$line);
    }
    
    echo $a;
    

    31 一些手册中的函数

     

    31.1 date

    //时间戳
    var_dump(time());
    var_dump(microtime(true));
    

    31.2 string

    var_dump(bin2hex('11')); //11 -> 4949->3131
    var_dump(strlen(chop('  1  ')));//3
    var_dump(chr(97)); //a
    var_dump(explode('.', 'www.baidu.com', 2));//[...]
    var_dump(implode('-', [1, 2])); //1-2
    var_dump(lcfirst("ABC"));//aBC
    var_dump(trim('abba','a')); //bb
    var_dump(ucfirst('abc')); //Abc
    

    32 字符串操作的例子

    function fn_gif()
    {
        var_dump('fn_gif');
    }
    
    function fn_png()
    {
        var_dump('fn_png');
    }
    
    function fn_jpg()
    {
        var_dump('fn_jpg');
    }
    
    $files = ['abc.gif', 'ax.x.jpg', 'file.JPG'];
    $len = count($files);
    for ($i = 0; $i < $len; ++$i) {
        $name = 'fn_' . strtolower(
            substr(
            strrchr($files[$i], '.'),
            1
            )
        );
        if (function_exists($name)) {
        $name();
        }
    }
    

    33 简单算法

     

    33.1 交换两个变量

    function swap(&$a, &$b)
    {
        if ($a != $b) {
        $a ^= $b;
        $b ^= $a;
        $a ^= $b;
        }
    }
    

    33.2 排序

     

    33.2.1 冒泡排序

    $arr = [4, 5, 6, 1];
    $len = count($arr);
    for ($i = 0, $stat = true; $i < $len && $stat; ++$i) {
        for ($j = 1, $stat = false; $j < $len - $i; ++$j) {
        if ($arr[$j] < $arr[$j - 1]) {
            $stat = true;
            swap($arr[$j], $arr[$j - 1]);
        }
        }
    }
    var_dump(implode($arr, ', '));
    

    33.2.2 选择排序

    $arr = [4, 2, 10, 11, 16, 1, 10, -6, 10, 1];
    $len = count($arr);
    for ($i = 0; $i < $len; ++$i) {
        for ($index = 0, $j = 1; $j < $len - $i; ++$j) {
        if ($arr[$j] > $arr[$index]) {
            $index = $j;
        }
        }
        swap($arr[$index], $arr[$j - 1]);
    }
    var_dump(implode($arr, ', '));
    

    33.3 二分查找(折半查找)

    $arr = [-10, -6, -1, 1, 2, 3, 4, 5, 6, 10, 11, 16, 100];
    function binary_search($arr, $value)
    {
        $search = function ($beg, $end) use (&$arr, &$value, &$search) {
        if ($beg > $end) {
            return false;
        }
        $mid = floor(($beg + $end) / 2);
        $val = $arr[$mid];
        if ($val === $value) {
            return true;
        }
        if ($val > $value) {
            $end = $mid - 1;
        } else {
            $beg = $mid + 1;
        }
        return $search($beg, $end);
        };
        return $search(0, count($arr) - 1);
    }
    
    if (binary_search($arr, 25)) {
        var_dump('find done');
    } else {
        var_dump('not find');
    }
    

    Created: 2019-12-28 周六 20:15

    Validate

  • 相关阅读:
    OkHttp3Stack volley
    Badge分析
    Android Icon数字角标(BadgeNumber)的实现方式
    Android ORMLite 框架的入门用法
    实现FlowLayout 自动排序标签
    iptables端口转发配置[Ubuntu]
    编译csipsimple的native部分
    开发JavaScript组件
    jQuery组件开发
    Groovy小结:java调用Groovy方法并传递参数
  • 原文地址:https://www.cnblogs.com/heidekeyi/p/12099260.html
Copyright © 2011-2022 走看看