PHP 踩坑实录

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);
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值