Wake Me Up When September Ends.

A wanderer capable of grasping the beauty of the grass, with a heart full of ancient charm, and a fondness for playful wit. Those who understand my words are knowledgeable individuals; those who decipher my code truly comprehend the essence. I am a wandering code swordsman, carrying my skills and riding freely through the digital world.

PHP 8.3已经如期发布,看一下新版特带来哪些特性!

常量类型化(Typed class constants)

定义常量目前可以标识类型了!

8.3 之前

1
2
3
4
5
6
7
8
9
interface I {
// 过往历史长河中总是认为PHP常量总是一个字符串
const PHP = 'PHP 8.2';
}

class Foo implements I {
// 但是实现类可能会将其定义为数组。
const PHP = [];
}

8.3 之后

1
2
3
4
5
6
7
8
9
interface I {
const string PHP = 'PHP 8.3';
}

class Foo implements I {
const string PHP = [];
}

//代码会发生致命错误:无法将数组用作类常量的值
阅读全文 »

很多时候我们在git库中,不小心把应该忽略的文件或目录提交远程库中,比如.idea.ivscode等。把远程删除,本地不发生变化,以下操作即可:

1.使用git rm 命令

git rm -r –cached 要删除的文件名或目录,如:

1
git rm -r --cached .idea #--cached 只删远程仓库的文件,不会删除本地的

2.提交操作记录描述

1
git commit -m '删除XX文件'

3.推送到远程仓库

1
git push -u origin <branch_name>

算法的本质

算法(algorithm)的本质是将问题划分为一系列可执行的步骤,并通过合理的计算和操作来达到预期的结果。同一个问题可以使用不同算法解决,但计算过程中消耗的时间和资源可能千差万别。

那如何比较不同算法之间的优劣呢?目前分析算法主要从时间和空间两个维度进行。

  1. 时间维度:时间复杂度(time complexity),算法需要消耗的时间。
  2. 空间维度:空间复杂度(space complexity),算法需要占用的内存空间。

因此,分析算法利弊主要从时间复杂度和空间复杂度进行。大多时候二者不可兼得,有时用时间换空间,有时用空间换时间,来满足所在场景需要!

阅读全文 »

在PHP8.1未发布fiber之前,你可能会听到一些前辈说”PHP的yield就是协程”,但是官方文档对于yield是如下解释:

yield(生成器)提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。
生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。

官方的解释自然是正确和科学的,可是你的疑问是这个和协程有什么直接关系呢?

所以我将从生成器概念讲起到yield关键字使用,再到协程概念。或许你会从我的讲解得到一些解惑,当然如有不正之处,欢迎指点!

生成器的概念

在计算机科学中,生成器是一种特殊的函数,它可以按需生成一系列值,而不需要一次性生成整个序列。比较直观的例子就是汽车厂家是按照订单生产汽车,来一个订单生产一辆。而不是先大批量生产之后再分发销售。这样的好处是厂家节省资源,避免浪费。

生成器还有一个重要特性是它能够暂停和恢复执行!还是以汽车厂家生产汽车为例子,假设厂家接受了两个汽车订单,一单生产轿车一单生产suv,但是生产suv进行一半流程中发现部分零件需要等待采购。厂家自然会暂停生产suv流程,转而去生产轿车避免生产线停产等待从而浪费资源。待零件采购回来再恢复suv生产流程。

这种暂停和恢复执行的能力在处理大量数据、遍历复杂的数据结构、实现惰性计算等场景下可以节省大量内存和提高性能。原因它只在需要时才生成值,而不是一次性生成整个序列!

阅读全文 »