liziyu 发布的文章

一、单一类型

类型说明版本
类/接口名称值必须为指定类和接口的实例化对象 instanceof
self值必须是用于类型声明相同类的 instanceof 。 仅可在类中使用。
parent值必须是用于类型声明父级类的 instanceof , 仅可在类中使用。
array值必须为 array。
callable值必定是一个有效的 callable。 不能用于类属性的类型声明。
bool值必须为一个布尔值。
float值必须为一个浮点数字。
int值必须为一个整型数字。
string值必须为一个 string。
iterable值必须为 array 或 instanceof Traversable。PHP 7.1.0
object值必须为object。PHP 7.2.0
mixed值可以为任何类型。PHP 8.0.0

二、允许为空的(Nullable)类型

自 PHP 7.1.0 起,类型声明允许前置一个问号 (?) 用来声明这个值允许为指定类型,或者为 null。

三、复合类型

还可以组合简单类型为复合类型。 PHP 支持以下方式复合类型:

  1. 简单类型联合。PHP 8.0.0 起可用。
  2. class-type(接口、类名)类型交集。PHP 8.1.0 起可用。

四、仅仅返回类型

void 是一个返回类型,用于标识函数没有返回值。 它不能是联合类型的一部分。 PHP 7.1.0 起可用。

https://www.php.net/manual/zh/language.types.declarations.php

1.数据查询语言(DQL)

数据查询语言(Data Query Language, DQL)保留字SELECTFROMWHEREGROUP BYHAVINGORDER BY(查询操作)。

2.数据定义语言(DDL)

数据定义语言 (Data Definition Language, DDL) CREATEALTERDROP三个语法所组成(对表结构操作)。

3.数据操纵语言(DML)

数据操纵语言(Data Manipulation Language, DMLINSERTUPDATEDELETE三种指令为核心(对表内数据操作)。

4.数据控制语言(DCL)

数据控制语言 (Data Control Language) 由 GRANTREVOKE 两个指令组成(权限管理)。

5.指针控制语言(CCL)

它的语句,像DECLARE CURSORFETCH INTOUPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

6.事务处理语言(TPL)

包括BEGIN TRANSACTIONCOMMITROLLBACK(事务控制)。

一般来说在Worker::runAll();调用前运行的代码都是在主进程运行的,onXXX回调运行的代码都属于子进程。注意写在Worker::runAll();后面的代码永远不会被执行。

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// 运行在主进程
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// 赋值过程运行在主进程
$tcp_worker->onMessage = function(TcpConnection $connection, $data)
{
    // 这部分运行在子进程
    $connection->send('hello ' . $data);
};

Worker::runAll();

注意代码中的注释哦!

注意:
1、不要在主进程中初始化数据库、memcacheredis等连接资源,因为主进程初始化的连接可能会被子进程自动继承(尤其是使用单例的时候),所有进程都持有同一个连接,服务端通过这个连接返回的数据在多个进程上都可读,会导致数据错乱。同样的,如果任何一个进程关闭连接(例如daemon模式运行时主进程会退出导致连接关闭),都导致所有子进程的连接都被一起关闭,并发生不可预知的错误,例如mysql gone away 错误。

2、推荐在onWorkerStart里面初始化连接资源。

转自:http://www.workerman.net

报错完整信息为:

Deprecated: Method ReflectionParameter::getClass() is deprecated in /vendor/topthink/think-container/src/Container.php on line 450
Script @php think service:discover handling the post-autoload-dump event returned with error code 255

这是因为在PHP8.0以后反射类ReflectionParameter::getClass() 已弃用,变更为getType()
只要找到文件vendor/topthink/think-container/src/Container.php修改替换即可。
如下图:
QQ20220215-172931@2x.png

详情见:https://github.com/top-think/framework/commit/df4a07d2f51307a6fabdf75dc5b4b7f8b0ad8af8

1、在文件support/helper.php添加:

function env($key, $default = null)
{
    static $env_config = [];
    if (!$env_config) {
        $env_config = include base_path() . DIRECTORY_SEPARATOR . '.env.php';
    }
    return $env_config[$key] ?? $default;
}

2、在项目根目录添加.env.php

<?php

// config/app.php
$app = [
    'APP_NAME' => 'webman',
    'APP_ENV' => 'dev',
    'APP_DEBUG' => true,
];

// config/database.php
$mysql = [
    'DB_HOST' => '127.0.0.1',
    'DB_PORT' => 3306,
    'DB_USER' => 'root',
    'DB_PASSWORD' => 'root',
];

//合并数组
return array_merge($app, $mysql);

3、在config/database.php中改为:

return [
    // 默认数据库
    'default' => 'mysql',

    // 各种数据库配置
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env("DB_HOST", '127.0.0.1'),
            'port' => env("DB_PORT", 3306),
            'database' => 'test',
            'username' => env('DB_USER', 'root'),
            'password' => env('DB_PASSWORD', 'root'),
            'unix_socket' => '',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

注意:.env.php 不提交到版本库(.gitignore里加一行.env.php)。

本文转自:https://www.workerman.net/q/7564

<?php
function foo(){
    static $int = 0;          // correct
    static $int = 1+2;        // correct 
    static $int = sqrt(121);  // wrong  (as it is a function)

    $int++;
    echo $int;
}
?>

常量表达式的结果可以赋值给静态变量,但是动态表达式(比如函数调用)会导致解析错误。因为静态声明是在编译时解析的。

eif.png

laravel自带中间件说明:

Authenticate 用户身份验证和重定向

EncryptCookies cookie 的加解密处理和验证

PreventRequestsDuringMaintenance 维护模式

RedirectIfAuthenticated 注册、登录、忘记密码时如果已经登录则跳转

TrimStrings 前后空白字符清理

TrustHosts 配置了受信任主机的白名单

TrustProxies 配置可信代理

VerifyCsrfToken 处理 CSRF 验证

SubstituteBindings 路由参数模型绑定中间件

ThrottleRequests 接口请求频率限制中间件

可以根据它自研引擎

CREATE TABLE `departments` (
  `dept_id` int(11) NOT NULL COMMENT '部门id',
  `dept_name` varchar(255) NOT NULL COMMENT '部门名',
  `leader` varchar(255) DEFAULT NULL COMMENT '部门主管',
  `parent_id` int(11) DEFAULT NULL COMMENT '父部门id',
  `created` datetime DEFAULT NULL COMMENT '创建时间',
  `updated` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`dept_id`),
  KEY `dept_id` (`dept_id`),
  KEY `parent_id` (`parent_id`),
  KEY `leader` (`leader`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `form_groups` (
  `group_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `group_name` varchar(255) NOT NULL COMMENT '组名',
  `sort_num` int(3) NOT NULL DEFAULT '0' COMMENT '排序号',
  `created` datetime DEFAULT NULL COMMENT '创建时间',
  `updated` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`group_id`),
  UNIQUE KEY `group_name` (`group_name`),
  KEY `group_id` (`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8mb4;

CREATE TABLE `process_instances` (
  `instance_id` varchar(40) NOT NULL COMMENT '审批实例ID',
  `title` varchar(255) DEFAULT NULL COMMENT '标题',
  `commit_user` varchar(50) DEFAULT NULL COMMENT '发起人ID',
  `forms` text COMMENT '表单内容',
  `status` varchar(10) DEFAULT NULL COMMENT '流程状态',
  `result` varchar(10) DEFAULT NULL COMMENT '流程结果',
  `instance_nodes` text COMMENT '流程审批链',
  `created` datetime DEFAULT NULL,
  `updated` datetime DEFAULT NULL,
  PRIMARY KEY (`instance_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `process_templates` (
  `template_id` varchar(50) NOT NULL DEFAULT '' COMMENT '审批摸板ID',
  `template_name` varchar(125) DEFAULT NULL COMMENT '摸板名称',
  `form_items` text COMMENT '摸板表单',
  `process` text COMMENT '流程数据',
  `icon` varchar(50) DEFAULT '' COMMENT '图标',
  `background` varchar(50) DEFAULT NULL COMMENT '图标背景色',
  `notify` varchar(255) DEFAULT NULL COMMENT '通知',
  `who_commit` varchar(1024) DEFAULT NULL COMMENT '谁能提交',
  `who_edit` varchar(1024) DEFAULT NULL COMMENT '谁能编辑',
  `who_export` varchar(1024) DEFAULT NULL COMMENT '谁能导出数据',
  `is_stop` bit(1) DEFAULT b'0' COMMENT '是否已停用',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `created` datetime DEFAULT NULL COMMENT '创建时间',
  `updated` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`template_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `template_group` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `template_id` varchar(50) NOT NULL,
  `group_id` int(11) NOT NULL,
  `sort_num` int(11) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `template_id` (`template_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=167 DEFAULT CHARSET=utf8mb4;


CREATE TABLE `users` (
  `user_id` int(11) NOT NULL COMMENT '用户id',
  `user_name` varchar(255) NOT NULL COMMENT '用户名',
  `pingyin` varchar(50) DEFAULT NULL COMMENT '拼音  全拼及首字母缩写',
  `alisa` varchar(255) DEFAULT NULL COMMENT '昵称',
  `avatar` varchar(255) DEFAULT NULL COMMENT '头像',
  `sex` bit(1) DEFAULT b'1' COMMENT '性别',
  `department_ids` varchar(255) NOT NULL COMMENT '部门id,分隔',
  `entry_date` date DEFAULT NULL COMMENT '入职日期',
  `leave_date` date DEFAULT NULL COMMENT '离职日期',
  `admin` int(2) DEFAULT '2' COMMENT '管理级别 0=主管理员 1=子管理员 2=普通员工',
  `created` datetime DEFAULT NULL COMMENT '创建时间',
  `updated` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`user_id`),
  KEY `user_id` (`user_id`),
  KEY `department_ids` (`department_ids`),
  KEY `leave_date` (`leave_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

对应demo
前端:https://github.com/willianfu/workflow-client
后端:https://github.com/willianfu/workflow-server