json_encode
问题:
b2b(后端-后端)
php接nodejs的接口时发现一个问题:
同样的请求数据在PHP请求时无法成功,通过postMan请求时是成功的
查看了第三方接口日志才发现,两次请求中只有中文编码不同,PHP的中文显示为Unicode格式
通过查证是包含中文的数组在 json_encode时被转为Unicode格式
解决方案:
json_encode([“test”=>“中文”], JSON_UNESCAPED_UNICODE)
编码时中文不转为Unicode编码
待整理
运算符
&
引用
引用一个变量,$a = &$b
就是$a
引用了$b
变量引用后修改$b
的话$a
的内容就会一起被修改
下面是在工作中遇到的逻辑需求,通过使用&
运算符就可以简单的实现
需求
将数据库中的配置数据结构如下
[“a” => 1, “b.a” => 1, “b.b” => 2, “c.a” => 1, “c.b.a” => 1, “c.b.b” => 2]
转化为以下格式
[“a” => 1, “b” => [“a” => 1, “b” => 2], “c” => [“a” => 1, “b” => [“a” => 1, “b” => 2]]]
一开始单纯使用循环,迭代,发现实现起来都非常麻烦,后来突然想到了&
$data = [];
foreach (["a" => 1, "b.a" => 1, "b.b" => 2, "c.a" => 1, "c.b.a" => 1, "c.b.b" => 2] as $key => $value) {
$cur = &$data;
foreach (explode('.', $key) as $slug) {
$cur = &$cur[$slug];
}
$cur = $value;
}
echo json_encode($data);
// output: {"a":1,"b":{"a":1,"b":2},"c":{"a":1,"b":{"a":1,"b":2}}}
递增&递减
递增
++$i
预递增:$i
先加1再返回
$i++
后递增:先返回$i
再加1
$i = ++$i;
相当于$i++;
<?php
$i = '1';
$j = $i++;
$f = ++$i;
echo "i: $i, j: $j, f: $f"; // 输出 i: 3, j: 1, f: 3
?>
非纯数字情况
<?php
$i = 'a'; $i++;
$f = 'z'; $j++;
$j = '*'; $f++;
echo "i: $i, j: $j, f: $f"; // 输出 i: b, j: *, f: aa
echo "\n";
$i = 'A'; $i++;
$j = 'Z'; $j++;
echo "i: $i, j: $j"; // 输出 i: b, j: *, f: aa
echo "\n";
$i = 'a*'; $i++;
echo "i: $i\n"; // 输出 i: a*
$i = 'aa'; $i++;
echo "i: $i\n"; // 输出 i: ab
$i = 'az'; $i++;
echo "i: $i\n"; // 输出 i: ba
$i = 'zz'; $i++;
echo "i: $i\n"; // 输出 i: aaa
$i = '*z'; $i++;
echo "i: $i\n"; // 输出 i: *z
$i = '9z'; $i++;
echo "i: $i\n"; // 输出 i: 10a
$i = 'z9'; $i++;
echo "i: $i\n"; // 输出 i: aa0
$i = '9*z'; $i++;
echo "i: $i\n"; // 输出 i: 9*a
$i = 'z*9'; $i++;
echo "i: $i\n"; // 输出 i: z*0
?>
字母递增可以理解成将a当成0,z当成9,不同的是9递增后为10,z递增后为aa
还有一种情况就是倒数第二个字符为非数字也非字母时9或z递增加一位的值会丢失
递减
--$i
预递减与$i--
后递减,同上
小记
递增递减对符号(如*
.
)等无效,递减只对纯数字有效
类
修饰符
成员修饰符
类的成员可以分为三种类型:
- private: 私有成员,只有本类可以用调用
- protected: 受保护成员,只有本类和继承类可以调用
- public: 公共成员,都可以访问
static:
- 用法: 在成员类型后可以增加该修饰符使其变成静态变量,就是可以无需实例化就可以被调用
- 优点: 无需实例化可以直接调用
- 缺点: 数据全局化,不能销毁,占用内存
调用
调用类的成员的写法有:
->
调用实例化对象的成员::
调用为实例化类成员- 实例化后可以调用?
- 未实例化时可以调用非静态成员?
实践过程
<?php
class A
{
// 定义常量(属于静态变量)
const CONST_A = 'ca';
// 定义成员变量(错误示范)
protected $a = 'a';
private $b = 'b';
public $c = 'c';
// 定义静态成员变量(可以被调用)
protected static $sa = 'sa';
private static $sb = 'sb';
public static $sc = 'sc';
public function __construct() {
// 定义成员变量
$this->__ca = '__ca';
$this->__cb = [
'__ca' => $this->__ca,
'&__ca' => &$this->__ca
];
// 定义成员变量 (错误示范)
// $this->$__ca = '__$ca'; // PHP Notice: Undefined variable: __ca in /data/161872053143888853.php on line 18
// $this::__ca = '__ca'; // PHP Parse error: syntax error, unexpected '=' in /data/161871997319410399.php on line 14
// self::__cb = '__cb'; // PHP Parse error: syntax error, unexpected '=' in /data/161871984162137838.php on line 14
// $this->$__cb = '__cb'; // PHP Notice: Undefined variable: __cb in /data/16187207867303974.php on line 21
// echo "\n__c:".self::$sc;
}
public function funa() {
// echo self::$c; // PHP Fatal error: Uncaught Error: Access to undeclared static property: A::$c in /data/161871931741857476.php:14
echo "\nfuna sc:".self::$sc;
// echo "\nfuna __ca:".self::$__ca; // PHP Fatal error: Uncaught Error: Access to undeclared static property: A::$__ca in
}
public function set() {
$this->__ca = '__ca_up';
}
}
// 为实例化调用
echo "\nCA:".A::CONST_A; // echo CA:ca
echo "\nCA:".A::$sc; // echo CA:sc
A::funa(); // echo funa sc:sc
// echo "\n__ca:".A::__ca; // PHP Fatal error: Uncaught Error: Undefined class constant '__ca' in /data/161871978814435476.php:25
// 实例化对象A
$ca = new A();
echo "\nCA:".$ca::CONST_A; // echo CA:ca
// 错误调用
// echo "\nCA:".$ca->CONST_A; // PHP Notice: Undefined property: A::$CONST_A in /data/161871911168635429.php on line 16
// echo "\na:".$ca->$a; // PHP Notice: Undefined variable: a in /data/161871896185667229.php on line 15 PHP Notice: Undefined property: A::$ in /data/161871896185667229.php on line 15
// echo "\nb:".$ca->$b; // PHP Notice: Undefined variable: b in /data/161871896185667229.php on line 16 PHP Notice: Undefined property: A::$ in /data/161871896185667229.php on line 16
// echo "\nc:".$ca->$c; // PHP Notice: Undefined variable: c in /data/161871896185667229.php on line 17 PHP Notice: Undefined property: A::$ in /data/161871896185667229.php on line 17
// echo "\nsa:".$ca::$sa; // PHP Fatal error: Uncaught Error: Cannot access protected property A::$sa in /data/16187188257228716.php:18
// echo "\nsb:".$ca::$sb; // PHP Fatal error: Uncaught Error: Cannot access private property A::$sb in /data/1618718912722319.php:19
// 调用静态成员变量
echo "\nsc:".$ca::$sc; // echo sc:sc
// echo "\nsc:".$ca->$sc; // PHP Notice: Undefined variable: sc in /data/16187191728777143.php on line 23 PHP Notice: Undefined property: A::$ in /data/16187191728777143.php on line 23
$ca->funa(); // echo funa sc:sc
$ca::funa(); // echo funa sc:sc
echo "\n__ca:".$ca->__ca; // echo __ca:__ca
echo "\n__cb:".json_encode($ca->__cb); // echo __cb:{"__ca":"__ca","&__ca":"__ca"}
// echo "\n__ca:".$ca::__ca; // PHP Fatal error: Uncaught Error: Undefined class constant '__ca' in /data/161871987250544717.php:40
$ca->set();
echo "\n__ca_up:".$ca->__ca; // echo __ca_up:__ca_up
echo "\n__cb:".json_encode($ca->__cb); // echo __cb:{"__ca":"__ca","&__ca":"__ca_up"}
$ca->__ca = '__ca_up2';
echo "\n__ca_up2:".$ca->__ca; // echo __ca_up2:__ca_up2
echo "\n__cb:".json_encode($ca->__cb); // echo __cb:{"__ca":"__ca","&__ca":"__ca_up2"}
// echo "\n__cb:".$ca->$__cb;
// echo "\nsb:".$ca::$sb;
trait
用法
应用场景
对象
clone
实例化一个类之后简单的新建一个变量赋值,这个对象的改变新的变量也还是会跟着改动
这个时候可以使用clone复制一个新的对象
$a = new A();
$b = $a // $b和$a还是同一个对象
$c = clone $a // $c则是一个新的对象
语法糖
...
传参
<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
function add($a, $b) {
return $a + $b;
}
echo add(...[1, 2])."\n";
$a = [1, 2];
echo add(...$a);
?>