为什么json_encode 返回false?

json_encode 所有字符串数据的编码必须是 UTF-8,不然返回false

怎样关闭浏览器就清空session?

ini_set('session.cookie_lifetime',0);

composer安装插件失败怎么办?

把安装目录下的composer.phar移动到项目根目录下:

1、找到composer位置的命令:which composer

2、把安装目录下的composer.phar移动到项目根目录下

3、在项目下正常运行安装命令即可

怎样判断微信浏览器关闭过?

javascript的sessionStorage,在微信关闭时会自动失效,默认设置。这里的关闭不是指彻底关闭微信,而是只要离开页面就会失效!

设置:

sessionStorage.setItem('inviteuid', inviteuid);

获取:

sessionStorage.getItem('inviteuid')

判断是否设置了:

sessionStorage.getItem("inviteuid") != null

if else 特殊用法?

if ($a) {
} else switch($a) {
}

if ($a) {
} else do {
} while (!$a);

//例如判断数组是否为空后做操作
if (count($array)) {
  for ($i = 0; $i < count($array); $i++) {
  }
} else {
  //数组为空的逻辑
}
//可以写成
if (count($array) == 0) {
   //数组为空的逻辑
} else for ($i = 0; $i < count($array); $i++) {
}

面试常考用法,特别坑,问输出什么?

$a = true;
if ($a) {
  echo “true”;
} else label: {
  echo “false”;
}
//转化后写法
$a = true;
if ($a) {
 echo "true";
} else {
 label: ;  //单独的一条语句
}
echo "false";
//所以运行结果是:truefalse
//label不是一个常量可以是任意字符串

unserialize()报错解决方案

unserialize(): Error at offset 0 of 13465 bytes

类似于上面这种报错大多数是因为缓存引起的,建议先彻底清掉缓存试一下,再找其他原因!

var_dump()的特殊输出

var_dump(1...9);//输出10.9

原因:

首先明确一点,var_dump()把1...9识别为了浮点数。

1...9会被依次识别为:1(浮点数1),然后是.(字符串连接符号),然后是.9(浮点数0.9)

function中...的用法

function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}
 
echo sum(1, 2, 3, 4);//输出10

function add($a, $b) {
    return $a + $b;
}
echo add(...[1, 2]);//输出3
$a = [1, 2];
echo add(...$a);//输出3

PHP 从5.6+开始在用户自定义函数中支持可变数量的参数列表

print不是函数,造成的影响

if (print("1\n") && print("2\n") && print("3\n") && print("4\n")) {
    ;
}//输出:4 111

实际上等同于:

if (print ("1\n" && print ("2\n" && print ("3\n" && print "4\n")))) {
  ;
}

解析:

print并不是一个函数,所以并不要求一定要有小括号(所以即使你写了小括号,括号也会在语法分析阶段被忽略),即:第一个代码块在PHP看来就是第二个代码块的样子。

所以就是:

最先输出4, 然后输出 "3\n" && print的结果1 , 然后输出 "2\n" && 1的结果1, 最后是 "1\n" && 1的结果1。

报错:No input file specified. 怎么办?

多数情况直接删除与入口文件同级的user.ini

file_exists在Linux系统下踩到的坑!

在Linux系统时,路径中的斜杠必须用(/)而不能用反斜杠(\)否则将识别不到文件。

后期静态绑定

首先说一下self的限制,使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类。

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}
class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}
B::test();//A

以上案例本意是想输出:B,却因为self限制而失败。

后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // 后期静态绑定从这里开始
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();//B

在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。

foo();
        static::foo();
    }
}

class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */
}

class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}

$b = new B();
$b->test();
$c = new C();
$c->test();   //fails

输出结果:

success!
success!
success!


Fatal error:  Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。

<?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();
//结果:
A
C
C