准备工作

  • 拥有自己的github帐号
  • packagist.org授权github登录

创建包项目

mkdir packname && cd packname

创建composer.json文件

手动创建 || composer init

创建git

开始写自己的类库

提交git

1
2
git add -A 
git commit -m 'first commit'

设置包版本

1
git tag v0.0.1

设置git仓库地址,然后上传

1
2
3
git branch -M main
git remote add origin 仓库地址
git push -u origin main

Submit package

输入git仓库地址Check,然后Submit,至此发布成功!

other

https://packagist.org/ 关联git仓库地址成功后会自动设置Webhooks(钩子),每次提交代码会自动更新到Packagist上没有自动设置的可以自己手动设置打开git仓库->settings->Webhooks->Add webhook
三个参数Payload URL:https://packagist.org/api/github?username=自己的用户名
Content type:application/json
Secret:从packagist->profile里获取

在 php 中有生成器这个东西。 官方的描述是

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

以及官方提供的改造range的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
function xrange($start, $limit, $step = 1) {
if ($start <= $limit) {
if ($step <= 0) {
throw new LogicException('Step must be positive');
}

for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Step must be negative');
}

for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}

/*
* 注意下面range()和xrange()输出的结果是一样的。
*/

echo 'Single digit odd numbers from range(): ';
foreach (range(1, 9, 2) as $number) {
echo "$number ";
}
echo "\n";

echo 'Single digit odd numbers from xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}

在我第一次看到的时候并没有思考为什么叫生成器这个东西。所以在一段时间内产生了迷惑。其实用官方编写的函数样本赋值给变量var_dump出来的结果会是一个对象,而其生成器的名字是因为其可以通过foreach在循环的每次成产出结果。所以可以看以下代码,来感受以下yield解决了什么问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
function xrange($start, $limit, $step = 1) {
if ($start <= $limit) {
if ($step <= 0) {
throw new LogicException('Step must be positive');
}

for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Step must be negative');
}

for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}

$xarr = xrange(0,9,1);
// 可以理解 $xarr 并不能用 一些数组切割的方式去做一些事情,因为其本身不是数组。
foreach($xarr as $v){
echo $v;
}
// 所以上述整体是做了这个
for($i = 0 ;$i<10;$i++){
echo $i;
}

$arr = range(0,9,1);
foreach($arr as $v){
echo $v;
}


以及更好看的文件读取编码方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function readTxt()
{
# code...
$handle = fopen("./test.txt", 'rb');

while (feof($handle)===false) {
# code...
yield fgets($handle);
}

fclose($handle);
}

foreach (readTxt() as $key => $value) {
# code...
echo $value.'<br />';
}

所以在某种程度,我更倾向于,这是一个特殊写法的语法糖。可以在某些方式上以优雅的形式去实现代码。

laravel 的 auth 生效流程

laravel bootstrap\app 中分别注册了 http 的中间件,和 ServiceProvider (服务提供者) 这两个东西。 但是在实际的生命周期中, 服务提供者 ServiceProvider 会先于 http 中间件先执行。 而 AuthServiceProvider 从结果上来说,可以认为他默认的行为是通过约定的方式,从 request 中获取 api_token 的值,然后在数据库中查询此 api_token 是否存在对应的 user 并设置在 auth 的一个属性。当你在 Authenticate 这个 http 中间件中调用 $this->auth->guard($guard)->guest() 实际上就是判断当前 auth 的 user 属性是否存在。不存在说明之前用 api_token 并没有查到 user 。所以如果需要定制化这一块,比如更换 token 的传输方式,或者 user 的获取方式, 需要更改服务提供者就可以。一般情况下不需要更改中间件。如果你需要给某些账户可以跳过中间件也可以在 http 中间件的代码的修改。不过一般来说是不需要修改中间件的。

阅读全文 »

阅读全文 »

利用class析构函数简化内存回收方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;
#define random(x) (rand() % x)
class NewNode
{
public:
NewNode *next = NULL;
int data = 0;
NewNode(int data = 0)
{
this->data = data;
}
~NewNode()
{
cout << "正在释放data为" << data << "的数据" << endl;
delete (next);
cout << "释放完成data为" << data << "的数据" << endl;
}
};

int main()
{
NewNode *head, *node;
head = node = new NewNode();
for (int i = 1; i < 10; i++)
{
node->next = new NewNode(i);
node = node->next;
}
node = head->next;
while (node != NULL)
{
cout << node->data << "\t";
node = node->next;
}
cout<<endl;

delete(head);
}
阅读全文 »

本篇文章针对节点的c++实现版本,针对本题的第二问链使结构的设计,提供一份数据结构以及一份可执行的g++文件,仅供参考

阅读全文 »
0%