b1cat`s

PHP快速入门

Word count: 7.8kReading time: 31 min
2018/09/17

PHP快速入门

写在前面的废话

第一次写入门教程,写的不好被骂不重要,重要的是把想要入门的同学带到坑里就十分愧疚了,在此希望看到此文的朋友可以帮忙指出问题,我会及时更正。

本篇文章以文档加个人少量见解写出,目的是帮助新手快速上手掌握具备开发的基础知识。内容主要关于PHP基础语法,常用函数操作,一些概念的理解。

文章的整个思路是以如何学习使用一件工具创造展开,包括PHP作为工具第一步是去找到它(安装),认识它(了解),知道怎么简单使用(熟悉语法,函数);第二步是作为一个组件配合其他组件一起使用(了解l/wamp);第三步,这是对工具已经很熟练了,自然是拿着工具搞事情(作为工具:开发,创造),把心中所想的东西创造出来;第四步,想要创建一个更加宏伟的工程,就需要和其他工具一同创造(作为组件:提供接口)。

这里只写了第一和第二步,因为我实在太懒了。如果大家能从这里获取到一些知识,我会继续更新下去,把作为工具:开发,作为组件:提供接口写下去。

由于长期以来太懒,知识体系复杂,相互之间又联系紧密,每一块知识都包括着许多块的知识,我又是个喜欢刨根问底的人,回溯根源又过于久远,想要精通一些知识很难。因此我想改变这一困境,构造一个快速学习,如环状的知识体系的环境 。若是你有什么快速学习的办法,或者快速构建知识体系,或者其他什么有趣的想法,又乐于分享的话,欢迎找我尬聊(blcat: x.y@tom.com)。

安装

下载链接:https://windows.php.net/download/

若缺少VCRUNTIME140.dll: https://www.cnblogs.com/danielchan-php/p/5071554.html

若要随时打开php交互,添加环境变量:把下载php压缩包解压目录添加环境变量中

如果证明成功添加PHP环境变量

若为Unix或者Mac平台可使用相应的包管理软件安装(如:apt,yum, brew..)

作为工具(如何使:基础语法和常用函数)

操作变量(语法,变量类型,变量相关操作,运算符)

什么是变量?我们知道数据是存储在电脑的空间中,空间的名字就是变量名,而空间中存储的数据就是变量,因为这个空间里的数据是可以改变的。

  • 语法(命名,语句格式)

    第一次运行:使用phpstorm(其他IDE也行)创建1.php文件写入<?php echo "I am here ! ";,运行后输出I am here !如下图

    关于<?php echo "I am here !";语法解释:

    <?php 为起始标签用于说明之后写的是php代码,对应的有闭合标签?>

    如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。所以上面代码无闭合标签。

    /** Created by PhpStorm **/ 这段是注释说明,说明了由phpstorm 创建的文件。

    /** xxx **/ 用于多行注释

    // 用于单行注释

    echo为php输出函数,相似的输出函数还有print() var_dump()

    输出123

    echo 123; //123

    print(123); //123

    var_dump(123); //int(123) 输出值和变量

    ; 作为每个php语句结束符

  • 变量类型

    定义变量的非常简单,在变量名前加美元符号$。变量名命名规范:普通变量一般小写,常量变量大写,函数名小驼峰(testFunction),类名和文件名一般大驼峰命名( TestFunction ),不可以数字或特殊符号开头

    上面我们输入的 "I am here !"属于字符串string型变量,123属于int整型变量,除此之外还有bool型、float浮点型、array数组型、Object对象型、Resource资源型、Null型、Callable/Callback回调类型

    string字符串

    定义一个字符串最简单就是用单引号或者双引号包裹起来,'php string' "string php " ,要表达引号及其他特殊符号如换行,需在双引号中使用转移符号\

    比如"you may said \"PHP is the best language!\""

    除此之外,还有两种不常用字符串格式,Heredoc和nowdoc(自5.3.0起)

    heredoc (用作写入大段文本且能解析其中的变量及特殊字符)

    以<<<为该运算符并在之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志。这里以test作为标识符示例:

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $str = <<< test
    Example of string
    using test as sign
    and heredoc syntax .
    test;

    //在结束定界符(可能其后有个分号)之后也必须紧跟一个换行。若没有则报错

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    /* 含有变量和类的更复杂示例 */
    <?php
    class foo
    {
    var $foo;
    var $bar;

    function foo()
    {
    $this->foo = 'Foo';
    $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
    }

    $foo = new foo();
    $name = 'MyName';

    echo <<<EOT
    My name is "$name". I am printing some $foo->foo.
    Now, I am printing some {$foo->bar[1]}.
    This should print a capital 'A': \x41
    EOT;
    /**
    输出My name is "MyName". I am printing some Foo.
    Now, I am printing some Bar2.
    This should print a capital 'A': A
    **/
    //$foo->foo foo对象的foo变量的值 "Foo"
    //$foo->bar[1] foo对象的bar数组的第二个值 "Bar2"

    Nowdoc(用作输出大段文本而无需解析特殊符号)

    与Heredoc不同的是需要将标识符用单引号包裹,其他均相同。

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $str = <<<'test'
    Example of string
    spanning multiple lines
    using nowdoc syntax.
    test;

    //nowdoc 也需要在结束出换行

    int整型

    int包括所有整数(含0,负整数)

    整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $a = 1234;
    $a = -123;
    $a = 022; // 八进制(等于十进制18)
    $a = 0x1A; // 十六进制(26)
    $a = 0b111; // 二进制(7)

    echo $a;

    int型数字是有范围的,32为操作系统打约20亿(有符号),64为9E18。

    定义或者运算超出范围将被自动转为float浮点型。

    float浮点型

    浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:

    1
    2
    3
    4
    5
    <?php
    $a = 1.234;
    $b = 1.2e3;
    $c = 7E-10;

    浮点数结果精度到最后一位是不可信的,因为取整而导致的相对误差为1.11e-16,且以10进制可以精确表示的0.1和0.7, 都无法被内部所使用的二进制精确表示。如使用floor取整floor((0.1+0.7)*10)后的结果为7,而非8。

    所以在比较浮点数时应限定一个精度值。

    array数组型

    主要用作将一组有联系的变量放在一起,也可以为空。

    定义一个数组

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $arr = array(); //定义空数组
    $a = []; //也可以这样定义
    $b = ["php""张三"123]; //可以是任何类型
    $c = ["hahha", ["array in array", “array2”], 1233]; //当然在数组里可以放数组

    $d = ["key1"=> "value2", 2=>"ddd", 666=>[]]; // c义关联数组(可以自定义命名键key)
    $bb = [0=>"php", 1=>"张三", 2=>123]; //和数组b一样,b属于省略键名
    1
    2
    3
    4
    5
    $b = ["php""张三"123];
    $b[] = "233333"; //追加23333

    $d = ["key1"=> "value2", 2=>"ddd", 666=>[]];
    $d["key1"] = "hello"; // 若追加键名原数组已经有了,追加狗覆盖掉对应的值

    遍历读取数组

    1
    2
    3
    4
    5
    <?php
    $d = ["key1"=> "value2", 2=>"ddd", 666=>[]];
    foreach($d as $key=>$value){
    echo $key+"=>"+$value+"\n"; //输出键值并换行,+表示拼接字符串
    }

    NULL型

    特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL

    在下列情况下一个变量被认为是 NULL

    • 被赋值为 NULL
    • 尚未被赋值。
    • unset()
    1
    2
    3
    4
    ><?php
    >$a = "I am code";
    >$a = null;
    >var_dump($a); // Null

    bool布尔型

    最简单的类型,表达真值,只有True 或False(不区分大小写)。

    False: 0、FALSE 、0.0、空值、空字符串、空数组、Null、未赋值的变量

    Object对象型

    要创建一个新的对象 object,使用 new 语句实例化一个类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    class foo
    {
    function do_foo()
    {
    echo "Doing foo.";
    }
    }

    $bar = new foo;
    $bar->do_foo();

    将在作为组件(如何创造:开发)中提及。

    Resource资源类型

    资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。所有这些函数及其相应资源类型见 PHP文档附录

    如打开文件、数据库连接、图形画布区域等的特殊句柄

    Callback/Callable回调类型

    自 PHP 5.4 起可用 callable 类型指定回调类型 callback。

    一些函数如 call_user_func()usort() 可以接受用户自定义的回调函数作为参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    function callback_f(){
    echo "This is call ..!";
    }

    function main(callable $func){ //这里就需要传递一个callable类型的函数
    call_user_func($func);
    }

    main("callback_f");
  • 变量相关操作

    变量类型判断(is_xx()函数)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    is_int(123) //True
    is_array():检查变量是否是数组。
    is_double()、is_float()、is_real():检查变量是否是浮点数。
    is_long()、is_int()、is_integer():检查变量是否是整数。
    is_string():检查变量是否是字符串。
    is_bool():检查变量是否是布尔值。
    is_object():检查变量是否是一个对象。
    is_resource():检查变量是否是一个资源。
    is_null():检查变量是否为null
    is_scalar():检查该变量是否是标量,即,一个整数、布尔值、字符串或浮点数。
    is_numeric():检查变量是否是任何类型的数字或数字字符串。
    is_callable():检查该变量是否是有效的函数名称。

    不建议使用gettype() 来测试某种类型,因为其返回的字符串在未来的php版本中可能会改变,此外,由于包含了字符串的比较,它的运行也是较慢的。建议使用is_函数代替。

    变量类型转化

    若当前的变量不是你需要的类型,可强制转化类型(typename)$var

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $a = 12333;
    $b = (string)$a;
    $c = (array)$a;
    var_dump($b,$c);
    /**
    string(5) "12333"
    array(1) {
    [0]=>
    int(12333)
    }
    **/

    变量相关常用函数

    字符串

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    $var = "This is a string !";
    $var_arr = explode(" ", $var); //以空格分割$var为数组

    $new_var = implode(",", $var_arr); //以逗号拼接数组值 join同作用

    $new = str_replace("string", "newcode", $var); //将$var中的string替换为newcode

    $len = strlen($new) //返回$new变量字符串个数

    $a = " Before and After ";
    $b = trim($a); //去掉首尾空白

    $place = strpos($a, "and"); //查找and在字符串中首次出现的位置。

    数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
    $arr = array("a"=> "香蕉""ha"=>"牛奶", "瓜子壳"=>"皮皮虾");

    array_keys($arr); //返回所以键

    array_values($arr); //返回所有的值

    array_push($arr, "cc"); //将cc字符串推入数组

    array_pop($arr); //取出数组最后一个元素

    array_shift($arr); //取出开头第一个元素

    array_key_exists($key, $arr); //查找是否存在$key这个键,返回bool

    count($arr); //返回数组个数

    array_unique($arr); //数组去重
  • 运算符

    PHP 算术运算符

    PHP 赋值运算符

    在 PHP 中,基本的赋值运算符是 “=”。它意味着左操作数被设置为右侧表达式的值。也就是说,”$x = 5” 的值是 5。

    PHP 递增/递减运算符

    PHP 比较运算符

    比较操作符可以让您比较两个值:

    PHP 逻辑运算符

    PHP 数组运算符

    三元运算符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (expr1) ? (expr2) : (expr3) 
    // 可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。
    <?php
    $test = 2;
    $number = isset($test) ? $test : "no number";
    $number = $test?:"no number";
    echo $number;

    //还有一种形式 ?? NULL合并运算符
    $num = $_GET['num'] ?? "no number";

    运算符优先级

    下表按照优先级从高到低列出了运算符。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。

    说明:左 = 从左到右,右 = 从右到左。

操作语句(流程控制)

判断if...else...

1
2
3
4
5
6
7
<?php
$a = 3;
if($a>1){
print("a>1");
}else{
print("1>a");
}
1
2
3
4
5
6
7
if($a>1){
//...
}elseif($a==1){
print("a==1")
}else{
//...
}

循环(while, do..while, for, foreach…..)

1
2
3
4
5
6
<?php
$a = 5;
while($a>0){ // 若a大于0就进入循环,a的值小于0之后就退出循环。
echo "我现在是$a\n";
$a--; // a的值减去1
}
1
2
3
4
5
6
7
8
<?php
$a = 5;
do{ //先执行一次,再进如循环
echo "我现在是$a\n";
}while($a>0){
echo "我现在是$a\n";
$a--;
}
1
2
3
4
<?php 					 //与while不同,for循环把变量,终止条件都写入参数,相对更加简洁
for($a=0; $a<10; $a+2){ //for循环需要三个参数,第一个起始值,第二个终于条件,第三个变量控制
echo "$a\n"; //每次循环完毕后执行对a的值+2,再与10比较,若小于进入循环
}
1
2
3
4
5
<?php
$arr = ["apple", "ipad", "Mac"];
foreach($arr as $key => $value){ //foreach多余遍历数组,读取数组的键值
echo "$value\n";
}

选择语句(switch…)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
switch($a){ //同if语句一样,需要对a变量值进行判断,然后执行对应代码。相比逻辑更加清晰
case "apple":
echo "apple not apple";
break; //每个case段中必须有个用于退出当前语句break关键字,缺失时会继续执行下段代码
case "mac":
echo "mac is best !";
break;
case 3:
echo "a can input string , number ...";
break;
default: //用于变量没有与上面值或产生非预期的问题时
echo "Hey, what are you doing ..";
}

跳出循环(continue)

1
2
3
4
5
6
7
8
<?php
for($a=1;$a<10;$a+2){
if($a==7){
echo "跳过了输出7...\n";
continue; //不同于break,break是终止当前语句,而continue是跳过当前循环
}
echo "$a\n";
}

跳转(goto)

1
2
3
4
5
6
<?php
goto a; //默认代码执行次序是一行一行执行的,使用goto直接跳转指定位置,常用于跳出循环
echo "Hello \n;";

a: //goto跳转的位置 (格式:目标/位置名,: 代码)
echo "World";

操作函数(语法,函数参数,返回值,内置函数,匿名函数,回调函数,生成器)

在数学里是给定一个x,通过某种规则都有唯一的一个y与之对应,这种规则就是函数。

比如计算不同圆的半径下圆的面积:y = f(x) , f(x) = π*x^2

用php实现就是

1
2
3
4
5
6
7
8
9
<?php
const π = 3.14; // 定义静态变量π的值为3.14

function f($r){ // f就是函数名,可以自定义;$r是传入的参数变量,相当于x
$y = π*$r^2; // 进行运算并将运算结果赋值给y变量
return $y; // 返回运算结果
}

echo f(2333); // 调用f函数

总的来说php中的函数是对重复逻辑的抽象,可以被重复调用执行

  • 语法

    上面的示例函数就是一个标准的函数,有参数$r,有返回值$y。所以定义一个函数很简单:

    1
    2
    3
    4
    5
    6
    function name(){   // funtion 声明这是个函数;后面为函数名;括号部分可自行决定是否要传参
    echo "这里是逻辑代码部分...."; // 逻辑代码实现被包裹咱{}内
    // 自行决定是否需要返回值
    }

    name(); //调用函数

    需要注意的是在函数内部属于自成空间,所有变量都是局部变量,无法直接调用和修改外部变量

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $var = 1233;
    function test(){
    $var = 2333;
    }

    test();
    echo $var; // 1233

    但是我就是想用函数修改呢?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $var = 1233;
    funtion test(){
    global $var; // 只需要在函数内部使用global关键字声明变量为全局变量
    $var = 2333;
    }

    test();
    echo $var; // 2333

    函数嵌套

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    function foo()
    {
    function bar()
    {
    echo "I don't exist until foo() is called.\n";
    }
    }

    /* 现在还不能调用bar()函数,因为它还不存在 */

    foo();

    /* 现在可以调用bar()函数了,因为foo()函数
    的执行使得bar()函数变为已定义的函数 */

    bar();

    递归函数

    要注意的是,递归函数需要一个终止的条件,避免递归函数/方法调用超过 100-200 层,出现无限递归可能会使堆栈崩溃。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    function recursion($a)
    {
    if ($a < 20) { //当变量a大于20后就停止调用
    echo "$a\n"; //输出变量a的值并换行
    recursion($a + 1); //这里在函数内部调用自己,每次+1
    }
    }

    recursion(2); //调用recursion函数,传递a的值为2

    有实际参数的函数

    注意的一点是有值得参数需要放在后面

    1
    2
    3
    4
    5
    6
    7
    <?php
    function test($name, $age=19){
    echo "$name:$age";
    }

    test("wzx"); // wzx:19
    test("xcv", 233); // xcv:233
  • 回调函数

    回调函数就是通过一个函数指针调用的函数,常用在一些特定状态/情况/场景触发。把一个函数的地址作为参数传递给另一个函数,当调用那个函数时,会自动调用我们传递的函数。

    PHP中已经实现了两个函数:

    call_user_func()、

    1
    2
    3
    4
    5
    6
    7
    8
    //call_user_func(callback, [$para]) 把第一个参数作为回调函数调用,其余参数为回调函数的参数
    function test($para){
    echo "This is test function called $para";
    }

    call_user_func("test", "hah"); // This is test function called hah


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //调用类里面的一个方法
    class Foo
    {
    static function t(){
    echo "This is Foo class t function called";
    }
    }

    call_user_func(array("Foo", "t")); // 尝试调用类内的非静态方法会产生一个警告

    $foo = new Foo();
    call_user_func(array($foo, "t")); // 实例化后可任意调用

    call_user_func_array()

    与call_user_func相比,更方便的传参

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //call_user_func_array(callback, array) 调用回调函数,并把数组中参数作为回调函数的参数
    function foobar($a1, $a2){
    echo "got $a1 and $a2 \n";
    }

    class foo
    {
    function bar($a1, $a2){
    echo "got $a1 and $a2 in Foo !\n";
    }
    }

    call_user_func_array("foobar", array("Tom", "Jim")); //调用函数

    $foo = new Foo();
    call_user_func_array(array($foo, "bar"), array("Tom", "Jim")); //调用类
  • 匿名函数

    匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况

    1
    2
    3
    4
    5
    6
    <?php
    // preg_replace_callback — 执行一个正则表达式搜索并且使用一个回调进行替换
    echo preg_replace_callback("(-[a-z])", function ($match){ //正则匹配横线字母
    return strtoupper($match[0][1]); // 将匹配到的替换为字母大写
    }, "hello-world");
    // 输出helloWord

    闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例

    1
    2
    3
    4
    5
    6
    7
    <?php
    $hah = function($name){
    print("Hello $name\n");
    }; // 和赋值变量一样,这里要有分号结束

    $hah("PHP");
    $hah("best language!");

    lamadba匿名函数

    1
    2
    <?php
    call_user_func(function($name){print("hello, $name");}, 'test');
  • 生成器

    生成器函数和普通函数语法一样,不同的是普通函数返回一个值,而生成器可以生成一组值。

    简单的实例生成一组从1-10的值:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    function generate(){
    for($i=1; $i <= 10; $i++){
    yield $i;
    }
    }
    $gen = generate();
    foreach($gen as $key => $value){
    echo "$value\n";
    }

    还可以指定key

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    function gen(){
    for($i=1; $i<=10; $i++){
    yield $i => $i*$i;
    }
    }

    $g = gen();
    foreach ($g as $key => $value){
    echo "$key:$value\n";
    }

    若将yield生成器写入表达式需要使用括号包裹。

    1
    2
    $data = (yield $var);
    $cata = (yield $key => $value);

操作文件(读取,写入,路径)

  • 读取

    1
    2
    3
    4
    5
    <?php
    $myfile = fopen("web.txat", "r") or die("Unable to open file!");
    echo fread($myfile,filesize("web.txt"));
    fclose($myfile);

    我们注意到使用fopen函数打开文件,有传递参数,一个是文件名,另一个是以只读模式打开文件

    打开的文件需要存在并且要有路径描述。

    关于路径有两种路径描述方式:

    1. 相对路径,即相对于当前php文件的路径。如在当前目录即与php文件同一目录下有个 web.txt,它的路径就是web.txt或者./web.txt ,一个点表示同级目录,如果在当前目录的上一级目录下有个hello.txt,路径调用就是../fello.txt, 每个../ 都表示向上级跨一个目录 。如果调用的文件还在上上上级目录下呢,就是../../../file.txt
    2. 绝对路径,即是从顶级/根目录开始的,比如我在桌面上有个work.txt,那么它的绝对路径就是C:/Destop/work.txt

    关于打开模式这里用的是r只读, 其他模式参见下表:

    image-201809192011233

    fread()函数读取文件,第一个参数打开文件的变量,第二个是规定打开读取的最大字节数。

    fread($myfile,filesize("web.txt")); filesize获取文件的所有字节数作为参数表示全部读完。

    fread()读取函数之外还有好多,fget()每次读取一行,还有诸如readfile(),file_get_content() , file,highlight()等。

    fclose()函数用于关闭打开的文件,参数是打开文件的变量。

  • 写入

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
    $txt = "Bill Gates\n";
    fwrite($myfile, $txt);
    $txt = "Steve Jobs\n";
    fwrite($myfile, $txt);
    fclose($myfile);

    fopen() 函数w写模式打开文件。

    fwrite()写函数,同类型函数有file_put_content()等。

    注意,用w模式写入已有内容的文件将会覆盖源文件。

  • 路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // basename($path)   返回路径中的文件名部分,参数是绝对路径
    $path = "c:/Destop/word.txt";
    echo basename($path); //输出word.txt

    //dirname($path) 获取目录名
    echo dirname($path); //输出c:\Destop

    //pathinfo($path) 数组有三项,1.目录名 2.文件名 3.文件拓展名 默认全部返回
    // 对应PATHINFO_DIRNAME,PATHINFO_BASENAME 和 PATHINFO_EXTENSION。
    $path_arr = pathinfo($path);
    echo $path_arr["dirname"]; //c:/Destop
    echo $path_arr["filename"]; //word.txt
    echo $path_arr["extension"]; //txt

    //直接获取扩展名
    echo pathinfo($path, PATHINFO_EXTENSION);

操作系统(动词)(执行系统操作)

所谓操作系统其实就是通过调用php系统函数执行命令。

php的内置函数exec,system都可以调用系统命令(shell命令),当然还有passthru,escapeshellcmd等函数。

注意:生产环境中禁止开启。测试时要想使用这系统函数需在php.ini中的安全模式必须关闭,即找到 disable_functions注释掉。

1
2
3
4
5
6
7
8
9
10
<?php
echo exec("dir"); //列出当前目录下所有的文件
echo exec("ping baidu.com"); //ping baidu.com
echo exec("ipconfig"); //查看系统IP配置

passthru("ping baidu.com"); //直接输出结果无需echo
system("ipconfig");

echo `dir`; //反撇号与shell_exec一样
echo shell_exec('dir');

作为组件(了解:l/wamp架构)

我们认识了工具并知道工具怎么用了之后,但是不足以能拿起来去大杀四方,我们需要召集伙伴,召集兄弟一起上,才能发挥真正的实力。

lamp:linux,apache,mysql,php

linux:操作系统

apache: Web服务器的一种,用以接收HTTP请求和响应。还有其他有名的如nginx, iis, lighttpd等

mysql: 数据库,用于储存数据。其他数据库还有mssql,oracel , mangodb, redis等。

php:用于处理HTTP请求和应答。

Windows安装

在windows上我们可以直接安装phpstudy, wamp继承环境。以phpstudy为例:

访问http://phpstudy.php.cn/下载安装

可能会提示缺少一些组件,百度下组件下载安装就好了

当全为绿色就是服务全部启动了,浏览器访问localhost页面显示hello world证明已全部安装好,可以搞事了。

linux安装

关于linux如何安装,这里不做赘述(玩linux就是要多折腾),可以选择一键安装包,也可以自行安装配置。

配置

Linux配置文件常见路径

php: /etc/php7/apache2/php.ini

apache: /etc/apache2/apache2.conf

mysql: /etc/mysql/my.cnf 一般不要使用,尤其是新手

apache中导入php模块

Windows继承环境配置文件

image-201809172244477

操作数据库(连接,程序)

php中有几种数据库操作函数,这里选用PDO拓展,因为它采用参数化查询,因而更加安全可靠。

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。

PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。

Windows:PDO 和所有主要的驱动作为共享扩展随 PHP 一起发布,要激活它们只需简单地编辑 php.ini 文件,并添加以下扩展:extension=php_pdo.dll

Linux: extension=pdo.so

连接

1
2
3
4
5
6
7
8
9
10
<?php
$dbms = "mysql"; // 数据库类型
$host = "localhost"; // 数据库地址
$dbname = "db_name"; // 数据库名
$user = "root"; // 数据库用户
$pass = "xxx"; // 数据库密码

$dsn = "$dbms:host=$host;dbname=$dbname";
$dbc = new PDO($dsn, $user, $pass);
echo "连接成功!";

执行

1
2
3
4
$user_arr = $dbc->query("select * from test");  // 从test这个表查询所有数据
foreach($user_arr as $value){
print($value);
}

PDO预处理语句

传统SQL语句都是通过拼接字符串加入用户提交的参数,而预处理是在执行sql语句之前对SQL查询语句进行处理,处理后所有提交的参数将作为字符串绑定到参数上,然后执行SQL语句。

这样做的目的是为了避免用户提交恶意的查询参数,获取到其他数据。

1
2
3
4
5
6
7
8
9
<?php
$db = new PDO($dsn, $user, $pass); // 新建数据连接
$statement = "select * from users where name = :name"; // SQL查询语句 :name为被绑定参数
$stmt = $db->prepare($statement); // 预处理语句
$stmt->bindParam(":name", "Tom"); // 替换参数:name
$stmt->execute(); // 执行

$stmt->bindParam(":name", "J"); // 插入不同的值
$stmt->execute();

更多详见PDO

操作HTTP请求

什么是HTTP呢?

搞Web的都知道HTTP这个名字,但HTTP具体是用来做什么的呢?

HTTP翻译是超文本传输协议,它定义了访问远端机器上的html文件,并返回应答内容。

那么如何请求呢?

HTTP定义了几种请求方法,大概8种:

GET: 向指定的资源发出”显示”的请求,GET方法多用于读取数据。

POST: 向指定的资源提交数据,请求服务器处理,多用于提交表单和上传文件。

HEAD: 与GET方法一样,都是向服务器发出指定资源的请求。只获取关于资源的信息,返回数据。

PUT: 向指定资源位置上传其最新内容。

DELETE: 请求服务器删除Request-URL所标识的资源。

TRACE:回显服务器收到的请求,主要用于诊断或测试。

OPTIONS: 返回服务端资源所有支持的方法。

CONNECT:HTTP/1.1中预留给能够将连接改为管道方式的代理器。

PATCH: 用于将局部修改应用到资源,不常用。

收到请求,如何应答呢?

所有HTTP响应的分为两部分,一部分是响应头,另一部分是响应内容。

响应头第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

状态代码的第一个数字代表当前响应的类型:

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

响应头其他行为服务器信息。

在HTTP响应头后(紧跟着一个空行后的HTML格式的文本)

HTTP示例(访问的百度HTTP请求和应答(工具为burpsuite))

访问的百度HTTP请求和应答

PHP如何操作呢?

在开始还需要了解下URL资源,也就是我们常说的网站的网址。比如百度百科url是什么网址:

https://baike.baidu.com/item/url/110640?fr=aladdin

它由4部分组成:协议(https,加密传输的http),主机地址(baike.baidu.com,由DNS解析为IP后访问),端口号(默认80不写),远程主机目录(/item/url/110640),参数(fr), 参数值(aladdin)

协议:http, https, ftp, file, mailto, news, ldap, telnet…….后加://

主机地址:域名/IP+端口

远程主机目录:需要访问文件文件的的路径,包含等级结构的路径定义,一般来说不同部分之间以斜线(/)分隔

参数:为了更加方便的访问用户想访问的资源,后端定义了一个参数,可以向这个参数传递值。多个参数之间需要用&若参数值为&需用转义符号\转义\&

位置标识符#:在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。

(部分协议需要再加用户名@密码 如:ftp://用户名:密码@FTP服务器IP地址或域名:FTP命令端口/路径/文件名)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$para = $_GET["para"]; // GET方法获取para参数值
echo $para;

$para = $_POST["para"]; // POST方法获取para参数值
echo $para;

$url = "https://s.taobao.com/search?app=mainSrp&q=一加手机5&cd=false#line2"
$path = parse_url($url);
var_dump($path);
/**
array(5) {
["scheme"]=>
string(5) "https"
["host"]=>
string(12) "s.taobao.com"
["path"]=>
string(7) "/search"
["query"]=>
string(36) "app=mainSrp&q=一加手机5&cd=false"
["fragment"]=>
string(5) "line2"
}
**/

参考链接

CATALOG
  1. 1. PHP快速入门
    1. 1.1. 写在前面的废话
    2. 1.2. 安装
      1. 1.2.1. 作为工具(如何使:基础语法和常用函数)
        1. 1.2.1.1. 操作变量(语法,变量类型,变量相关操作,运算符)
        2. 1.2.1.2. 操作语句(流程控制)
        3. 1.2.1.3. 操作函数(语法,函数参数,返回值,内置函数,匿名函数,回调函数,生成器)
        4. 1.2.1.4. 操作文件(读取,写入,路径)
        5. 1.2.1.5. 操作系统(动词)(执行系统操作)
      2. 1.2.2. 作为组件(了解:l/wamp架构)
        1. 1.2.2.1. Windows安装
        2. 1.2.2.2. linux安装
        3. 1.2.2.3. 配置
        4. 1.2.2.4. 操作数据库(连接,程序)
        5. 1.2.2.5. 操作HTTP请求
      3. 1.2.3. 参考链接