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

posted @ 2019-12-25 22:08  heidekeyi  阅读(456)  评论(0编辑  收藏  举报