PHP基础

php及时生效

详细看这里

  1. service php-fpm restart
  2. 修改php.ini的opcache.revalidate_freq=1

php 类与对象

详细看这里

const

可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号,因为常量不能重新赋值,所有一定要有初始值,不能用对象来访问。内部用self, 一般为大写。

class MyClass
{
         const CONSTANT = 'constant value';
         function showConstant()  {
                echo  self::CONSTANT . "\n";
         }
}
echo MyClass::CONSTANT . "\n";
$classname = "MyClass";
echo $classname::CONSTANT . "\n"; // 自 5.3.0 起
$class = new MyClass();
$class->showConstant();
echo $class::CONSTANT."\n"; // 自 PHP 5.3.0 起

instanceof

可以确定一个对象是类的实例、子类、还是实现了某个特定的接口if ($man instanceof Person)

static

详细看这里

static类似一个类的全局变量。假设一个普通的类属性$country='china',当被实例化多个对象时,每个对象都有一个$country='china'的属性,互相不影响。但当被static $country='china' 声明时,即变成了共享,属于类不属于对象。
所以,当方法与实例关系不大时,也就是当你希望摆脱实例化的限制直接使用类中的一个方法或属性时,可以定义为 static。
此外在效率上:类名访问静态方法 > 实例访问静态方法 > 实例访问非静态成员方法
如果属性与实例的关系几乎为0时,建议定义为 const 常量

(1)、静态属性及方法不需要实例化即可调用(因为静态属性存放的位置是在类里,
                    外部调用方法为 "类名::$属性名", 内部调用“self::$属性名”);
(2)、静态方法不能调用非静态属性及方法。(因为非静态属性需要实例化后,存放在对象里);
(3)、非 static 方法能调用 static 方法是必须的(需要理解的是 static 虽然是属于类,只能说它是公共的,也属于实例)
(4)、***调用类的静态函数时不会自动调用类的构造函数***。

重载 & 重写

  1. 重写:一般在子类中定义和父类相同的方法名,将会重写该方法。
  2. 重载:如果要基于父类的方法修改或添加东西,则使用parent::say();重载复制父类的方法体过来。
    function say() {  // 重载的方法权限一定要***高于或等于***父类方法的权限 public
    parent::say();
    echo "新添加的内容";
    }

构造 & 析构

  1. 构造函数:function __construct(){} 每当new一个实例时,会被调用
  2. 析构杉树:function __destruct(){} 每当对象被销毁之前,会被调用
function __destruct(){
    echo $this->name;
}
$person1 = new Person('张三');
$person1 = null;
$person1 = new Person('李四');
$person1 = new Person('王五');
输出顺序为:张三,王五,李四   // 先被销毁的对象先输出,由于栈的后进先出,所以后面的顺序是王五,李四。

OOP

  1. 面向对象的三大特性:

    1. 封装:public; protected; private;
    2. 继承:extends
      3.多态:parent::重载,重写
  2. 抽象方法

    没有方法体且用abstract声明的方法 abstract function fun1();

  3. 抽象类

    只要有一个抽象方法且用abstract声明的类, 也就是说可以有其他非抽象方法但不能用private去修饰 abstract class Person{}

  4. 抽象类的作用

    由于抽象类(是半成品)不能被实例化,也即是建不了对象,所以不能直接使用,它是为它的子类定义公共接口,将它的操作交给子类去实现,所以它是定义一种规范,让子类去遵守,当子类继承抽象类以后,就必须把父类中的抽象方法全部实现。否则子类还是抽象类,要使用必须用子类extends去继承

  5. 接口

    如果抽象类中的所有方法都是抽象方法,那么就可以使用接口去声明interface name {}, 接口中必须都是抽象方法(所有可以省去abstract)且必须都是public(所以你可以省去),只能用const声明常量。要使用必须用子类implements去实现
    一个PHP类只能有一个extends继承,但是可以implements实现多个接口,如果要同时,extends必须在前。

  6. trait

    trait是为了减少单继承语言的限制而生。它是混入类中使用的,所以无法new去实例化它,但可以在类中使用trait中的方法,使用use Demo1_trait;而不是extends继承。

    1. 如果使用一个继承类中的方法,优先顺序是:来自当前类的成员覆盖了trait的方法,而trait则覆盖了被继承的父类或基类的方法
    2. trait 中可以嵌套一个或多个trait use Demaon3_trait, Demaon4_trait;
    3. Trait 支持修饰词,例如:final, static, abstract.
    4. 可以使用insteadof 及 as 操作符解决trait之间的冲突。
    5. 使用as语法还可以用来调整方法的访问控制。
class Demo_class {
    use Demo1_trait, Demo2_trait {
            Demon1_trait::func insteadof Demo2_trait;  // 万一两个trait中有相同的方法,用insteadof可以指定,这里是指定demeon1
    }
}
  1. 多态

    多态其实是一种思想:就是让具有继承关系的不同类对象,可以对相同名称的成员函数进行调用,产生不同的反应效果。在PHP中即是,方法的重写。

interface USB() {
        function run();
}
class Computer {
        function useUSB($usb){
                $sub->run();
        }
}
$computer = new USB();
$computer->useUSB(new Ukey());
$computer->useUSB(new Umouse());
....
class Ukey implements USB{
        function run(){
                echo "运行USB键盘设备";
        }
}

递归

在函数体内直接自个调用自个,但需要设置自调用的条件,若满足条件,则调用函数自身,若不满足则停止本函数的自调用,然后把目前流程的主控权交回给上一层函数来履行

  1 <?php
  2
  3 function test($n) {
  4     echo $n;
  5     echo PHP_EOL;
  6
  7     if ($n > 0) {
  8         test($n-1);
  9         // return;
 10     }
 11
 12     echo $n;
 13     echo PHP_EOL;
 14 }
 15
 16 test(2);

输出

2
1
0     // 至此条件不满足,结束自调用,将主控权交给上一层函数
0     // 紧接着执行test函数后面的语句,依次传0
1     // 传1
2     // 传2

题目:1元1瓶水,2空瓶1瓶水,3瓶盖1瓶水,计算20元能买多少瓶水?

/**
 * 1元1瓶水,2空瓶1瓶水,3瓶盖1瓶水,20元多少瓶水
 *
 * @param total 水的总数
 * @param b     空瓶
 * @param l     瓶盖
 */
public static void cntTableWater(int total, int b, int l) {
    // 初始化水、空瓶、瓶盖数量
    int water = total, bottle = b, lid = l;
    // 产生的新的水
    int newWater = bottle / 2 + lid / 3;
    // 新的空瓶和瓶盖
    bottle = newWater + bottle % 2;
    lid = newWater + lid % 3;
    // 将消耗的水累计
    water += newWater;
    // 已经无法兑换,则输出消耗的水
    if (bottle < 2 && lid < 3)
        System.out.println(water);
    else
        cntTableWater(water, bottle, lid);
}
 最后,运行结果是113,即可以买113瓶水。程序计算很简单

php浮点运算

所有程序浮点运算一定要使用高精度函数库,因为计算机存储的小数点不一定真实。
php高精度计算问题

php高精度bcmath库

        bcadd — 将两个高精度数字相加     //      bcadd(0.1,   0.7,   2);
  bccomp — 比较两个高精度数字,返回-1, 0, 1
  bcdiv — 将两个高精度数字相除
  bcmod — 求高精度数字余数
  bcmul — 将两个高精度数字相乘
  bcpow — 求高精度数字乘方
  bcpowmod — 求高精度数字乘方求模,数论里非常常用
  bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
  bcsqrt — 求高精度数字平方根
  bcsub — 将两个高精度数字相减

php获取原始请求

  1. get // $_GET['name'];
  2. post
    $res = file_get_contents("php://input");
    $res = json_decode($res);

    2.1 键值对 // $_POST['name'];

问号?语法

  1. 1 ? 1 : 2 // 1 正规语法
  2. 1 ?: 2 // 1 // PHP 简写
  3. 0 ?: 2 // 2
  4. js 必须走正规语法

数组

  1. 移除第一个元素array_shift($arr);
  2. 插入第一个元素array_unshift($arr, 2);
  3. 移除最后一个元素array_pop($arr);
  4. 插入最后一个元素array_push($arr, 2);
  5. 去除元素array_splice($arr, 2, 2); // 从第二位开始去除2个元素
  6. 插入元素array_splice($arr, 2, 0, [99,88]); // 从第二位开始插入[99,88]这个数组
  7. 截取元素return array_slice($array, 0, 2); //从第0位开始截取2个元素,中间如为负数则从末尾截取
  8. 合并数组return array_merge($arr1, $arr2);

++$i 与 $i++

  1. ++$I 是 $i 先自加,后赋值
  2. $i++ 是 $i 先赋值,后 自加
    $i = 1;
    $a = $i++;
    dump($i);  // 2
    dump($a);  // 1
    $b = ++$i; // 3
    dd($b);

PHP引用

详细看这里

& 符号引用,表示:使用了&,引用地址,表示两个变量指向了同一个内容,当改变$b时,内存中的内容被改变,$a的值被改变

  1. 是变量的情况
    $a = 23;
    $b = &$a;
    $b=44;
    echo $a; //$a = 44;

PHP 库

  1. composer require guzzlehttp/guzzle:~6.0 //http/https 请求库 详细看这里
    $client  = new \GuzzleHttp\Client();
    $url = 'https://127.0.0.1:6001';  // 如果NGINX定义https访问 
        $array = [
            'headers' => [
                'Authorization' => 'Bearer '.$auth_key
            ],
            'http_errors' => false,   #支持错误输出
            'verify' => false   // 不验证ssl(不安全),可以传‘/full/path/to/cert.pem’
        ];
        $res = $client->request('GET', $url, $array);
        $channel_users = json_decode($res->getBody()->getContents(), true);

常用字符串函数

  1. trim($str, '0..9 A..Z .'); 去除两边空格,或预定义字符(过滤预定的字符),还有ltrim(); 左 rtrim();右
  2. str_pad($str, 10, '-'); 填充字符串到指定长度,默认为空格,也可以指定填充字符
  3. strtolower($str); 将字符串转为小写,大写用strtoupper();
  4. ucfirst($str); 将字符串首字母转为大写,将单词首字母转大写用ucwords();
  5. nl2br($str); 在输出到浏览器的字符串中的'\n'换行前加入'
    '
  6. htmlspecialchars($str); 将表单中的html转为实体。
  7. strip_tags($str); 删掉所有html标签
  8. strrev($str); 字符串反转
  9. number_format($number, 2); 千位分组格式化数字123,456,789.00
评论数量: 0

0
点赞
165
浏览
0
评论

贡献 23